Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@repeatgg/react-paypal-button-v2

Package Overview
Dependencies
Maintainers
6
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@repeatgg/react-paypal-button-v2 - npm Package Compare versions

Comparing version
2.7.1
to
2.7.2
+11
.babelrc
{
"presets": [
"@babel/preset-env",
"@babel/preset-react",
"@babel/preset-typescript"
],
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-object-rest-spread"
]
}
module.exports = {
preset: "ts-jest",
collectCoverageFrom: [
"src/**/*.{js,jsx,ts,tsx}"
],
transform: {
"^.+\\.tsx?$": "babel-jest",
},
roots: [
"<rootDir>/src"
],
globals: {
"ts-jest": {
"babelConfig": true
},
},
transformIgnorePatterns: ["<rootDir>/node_modules/"],
moduleNameMapper: {
"\\.(css)$": "<rootDir>/node_modules/jest-css-modules"
},
snapshotSerializers: ["enzyme-to-json/serializer"],
moduleFileExtensions: [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
],
}
import React from "react";
import ReactDOM from "react-dom";
import PropTypes from "prop-types";
declare global {
interface Window { paypal: any }
}
export interface PayPalButtonProps {
amount?: number|string,
currency?: number|string,
shippingPreference?: "NO_SHIPPING" | "GET_FROM_FILE" | "SET_PROVIDED_ADDRESS",
onSuccess?: Function,
catchError?: Function,
onError?: Function,
createOrder?: Function,
createSubscription?: Function,
onApprove?: Function,
style?: object,
options?: PaypalOptions,
onButtonReady?: Function,
onCancel?: Function,
onClick?: Function,
}
export interface PayPalButtonState {
isSdkReady: boolean
}
export interface PaypalOptions {
clientId?: string,
merchantId?: string,
currency?: number|string,
intent?: string,
commit?: boolean|string,
vault?: boolean|string,
component?: string,
disableFunding?: string,
disableCard?: string,
integrationDate?: string,
locale?: string,
buyerCountry?: string,
debug?: boolean|string
}
class PayPalButton extends React.Component<PayPalButtonProps, PayPalButtonState> {
static propTypes = {
amount: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
currency: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
shippingPreference: PropTypes.string,
onSuccess: PropTypes.func,
catchError: PropTypes.func,
onError: PropTypes.func,
createOrder: PropTypes.func,
createSubscription: PropTypes.func,
onApprove: PropTypes.func,
onCancel: PropTypes.func,
onClick: PropTypes.func,
style: PropTypes.object,
options: PropTypes.shape({
clientId: PropTypes.string,
merchantId: PropTypes.string,
currency: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
intent: PropTypes.string,
commit: PropTypes.oneOfType([
PropTypes.bool,
PropTypes.string
]),
vault: PropTypes.oneOfType([
PropTypes.bool,
PropTypes.string
]),
component: PropTypes.string,
disableFunding: PropTypes.string,
disableCard: PropTypes.string,
integrationDate: PropTypes.string,
locale: PropTypes.string,
buyerCountry: PropTypes.string,
debug: PropTypes.oneOfType([
PropTypes.bool,
PropTypes.string
])
}),
onButtonReady: PropTypes.func,
}
static defaultProps = {
style: {},
options: {
clientId: "sb",
currency: "USD"
},
shippingPreference: "GET_FROM_FILE",
}
constructor(props: PayPalButtonProps) {
super(props);
this.state = {
isSdkReady: false,
};
}
componentDidMount() {
if (
typeof window !== "undefined" &&
window !== undefined &&
window.paypal === undefined
) {
this.addPaypalSdk();
}
else if (
typeof window !== "undefined" &&
window !== undefined &&
window.paypal !== undefined &&
this.props.onButtonReady
) {
this.props.onButtonReady();
}
}
createOrder(data: any, actions: any) {
const { currency, options, amount, shippingPreference } = this.props;
return actions.order.create({
purchase_units: [
{
amount: {
currency_code: currency
? currency
: options && options.currency
? options.currency
: "USD",
value: amount.toString()
}
}
],
application_context: {
shipping_preference: shippingPreference
}
});
}
onApprove(data: any, actions: any) {
return actions.order
.capture()
.then((details) => {
if (this.props.onSuccess) {
return this.props.onSuccess(details, data);
}
})
.catch((err) => {
if (this.props.catchError) {
return this.props.catchError(err);
}
});
}
render() {
const {
amount,
onSuccess,
createOrder,
createSubscription,
onApprove,
onClick,
onCancel,
style,
} = this.props;
const { isSdkReady } = this.state;
if (
!isSdkReady &&
(typeof window === "undefined" || window.paypal === undefined)
) {
return null;
}
const Button = window.paypal.Buttons.driver("react", {
React,
ReactDOM,
});
const createOrderFn =
amount && !createOrder
? (data: any, actions: any) => this.createOrder(data, actions)
: (data: any, actions: any) => createOrder(data, actions);
return (
<Button
{...this.props}
createOrder={createSubscription ? undefined : createOrderFn}
createSubscription={createSubscription}
onApprove={
onSuccess
? (data: any, actions: any) => this.onApprove(data, actions)
: (data: any, actions: any) => onApprove(data, actions)
}
onCancel={onCancel}
onClick={onClick}
style={style}
/>
);
}
private addPaypalSdk() {
const { options, onButtonReady } = this.props;
const queryParams: string[] = [];
// replacing camelCase with dashes
Object.keys(options).forEach(k => {
const name = k.split(/(?=[A-Z])/).join("-").toLowerCase();
queryParams.push(`${name}=${options[k]}`);
});
const script = document.createElement("script");
script.type = "text/javascript";
script.src = `https://www.paypal.com/sdk/js?${queryParams.join("&")}`;
script.async = true;
script.onload = () => {
this.setState({ isSdkReady: true });
if (onButtonReady) {
onButtonReady();
}
};
script.onerror = () => {
throw new Error("Paypal SDK could not be loaded.");
};
document.body.appendChild(script);
}
}
export { PayPalButton };
/* A light wrapper to apply enzyme adapter configuration and expose enzyme members */
import "raf/polyfill";
import { configure, shallow, mount, render } from "enzyme";
import Adapter from "enzyme-adapter-react-16"
configure({ adapter: new Adapter() });
export { shallow, mount, render };
/* eslint-disable */
const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
/* eslint-enable */
const libraryName = "reactGlide";
module.exports = {
entry: path.join(__dirname, "src"),
output: {
path: path.join(__dirname, "lib"),
library: libraryName,
filename: libraryName + ".js",
libraryTarget: "umd",
umdNamedDefine: true,
publicPath: "/"
},
optimization: {
splitChunks: {
cacheGroups: {
styles: {
name: "styles",
test: /\.css$/,
chunks: "all",
enforce: true
}
}
},
minimizer: [
new UglifyJsPlugin({
exclude: /\.html/,
parallel: true,
sourceMap: true
}),
new OptimizeCSSAssetsPlugin({})
]
},
module: {
rules: [
{
test: /^(?!.*test\.tsx|\.ts?$).*\.tsx|\.ts?$/,
exclude: /node_modules/,
use: ["babel-loader"]
},
{
test: /\.css/,
exclude: /node_modules/,
use: [
"style-loader",
"css-loader",
]
},
{
test: /^(?!.*test\.tsx|\.ts?$).*\.tsx|\.ts?$/,
exclude: /node_modules/,
use: ["source-map-loader"],
enforce: "pre"
},
]
},
resolve: {
extensions: [".js", ".tsx", ".css", ".ts", ".jsx"],
},
devServer: {
contentBase: "dist",
port: 3000,
open: true,
host: "localhost",
hot: true
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new HtmlWebpackPlugin({
template: "example/index.html",
filename: "index.html"
}),
new MiniCssExtractPlugin({
entry: "src/index.css",
filename: libraryName + ".css",
chunkFilename: libraryName + ".[id].css"
}),
]
};
+10
-10

@@ -21,4 +21,4 @@ import React from "react";

onButtonReady?: Function;
onCancel?: Function;
onClick?: Function;
onCancel?: Function;
}

@@ -45,4 +45,4 @@ export interface PayPalButtonState {

static propTypes: {
amount: PropTypes.Requireable<string | number>;
currency: PropTypes.Requireable<string | number>;
amount: PropTypes.Requireable<NonNullable<string | number>>;
currency: PropTypes.Requireable<NonNullable<string | number>>;
shippingPreference: PropTypes.Requireable<string>;

@@ -52,7 +52,7 @@ onSuccess: PropTypes.Requireable<(...args: any[]) => any>;

onError: PropTypes.Requireable<(...args: any[]) => any>;
onCancel: PropTypes.Requireable<(...args: any[]) => any>;
onClick: PropTypes.Requireable<(...args: any[]) => any>;
createOrder: PropTypes.Requireable<(...args: any[]) => any>;
createSubscription: PropTypes.Requireable<(...args: any[]) => any>;
onApprove: PropTypes.Requireable<(...args: any[]) => any>;
onCancel: PropTypes.Requireable<(...args: any[]) => any>;
onClick: PropTypes.Requireable<(...args: any[]) => any>;
style: PropTypes.Requireable<object>;

@@ -62,6 +62,6 @@ options: PropTypes.Requireable<PropTypes.InferProps<{

merchantId: PropTypes.Requireable<string>;
currency: PropTypes.Requireable<string | number>;
currency: PropTypes.Requireable<NonNullable<string | number>>;
intent: PropTypes.Requireable<string>;
commit: PropTypes.Requireable<string | boolean>;
vault: PropTypes.Requireable<string | boolean>;
commit: PropTypes.Requireable<NonNullable<string | boolean>>;
vault: PropTypes.Requireable<NonNullable<string | boolean>>;
component: PropTypes.Requireable<string>;

@@ -73,3 +73,3 @@ disableFunding: PropTypes.Requireable<string>;

buyerCountry: PropTypes.Requireable<string>;
debug: PropTypes.Requireable<string | boolean>;
debug: PropTypes.Requireable<NonNullable<string | boolean>>;
}>>;

@@ -90,5 +90,5 @@ onButtonReady: PropTypes.Requireable<(...args: any[]) => any>;

onApprove(data: any, actions: any): any;
render(): JSX.Element;
render(): React.JSX.Element;
private addPaypalSdk;
}
export { PayPalButton };
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {

@@ -9,46 +7,26 @@ value: true

exports.PayPalButton = void 0;
var _react = _interopRequireDefault(require("react"));
var _reactDom = _interopRequireDefault(require("react-dom"));
var _propTypes = _interopRequireDefault(require("prop-types"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var PayPalButton = /*#__PURE__*/function (_React$Component) {
_inherits(PayPalButton, _React$Component);
var _super = _createSuper(PayPalButton);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
var PayPalButton = exports.PayPalButton = /*#__PURE__*/function (_React$Component) {
function PayPalButton(props) {
var _this;
_classCallCheck(this, PayPalButton);
_this = _super.call(this, props);
_this = _callSuper(this, PayPalButton, [props]);
_this.state = {

@@ -59,4 +37,4 @@ isSdkReady: false

}
_createClass(PayPalButton, [{
_inherits(PayPalButton, _React$Component);
return _createClass(PayPalButton, [{
key: "componentDidMount",

@@ -74,6 +52,6 @@ value: function componentDidMount() {

var _this$props = this.props,
currency = _this$props.currency,
options = _this$props.options,
amount = _this$props.amount,
shippingPreference = _this$props.shippingPreference;
currency = _this$props.currency,
options = _this$props.options,
amount = _this$props.amount,
shippingPreference = _this$props.shippingPreference;
return actions.order.create({

@@ -95,3 +73,2 @@ purchase_units: [{

var _this2 = this;
return actions.order.capture().then(function (details) {

@@ -111,18 +88,15 @@ if (_this2.props.onSuccess) {

var _this3 = this;
var _this$props2 = this.props,
amount = _this$props2.amount,
onSuccess = _this$props2.onSuccess,
createOrder = _this$props2.createOrder,
createSubscription = _this$props2.createSubscription,
onClick = _this$props2.onClick,
onCancel = _this$props2.onCancel,
onApprove = _this$props2.onApprove,
style = _this$props2.style;
amount = _this$props2.amount,
onSuccess = _this$props2.onSuccess,
createOrder = _this$props2.createOrder,
createSubscription = _this$props2.createSubscription,
onApprove = _this$props2.onApprove,
onClick = _this$props2.onClick,
onCancel = _this$props2.onCancel,
style = _this$props2.style;
var isSdkReady = this.state.isSdkReady;
if (!isSdkReady && (typeof window === "undefined" || window.paypal === undefined)) {
return null;
}
var Button = window.paypal.Buttons.driver("react", {

@@ -145,4 +119,4 @@ React: _react["default"],

},
onCancel: onCancel,
onClick: onClick,
onCancel: onCancel,
style: style

@@ -155,8 +129,8 @@ }));

var _this4 = this;
var _this$props3 = this.props,
options = _this$props3.options,
onButtonReady = _this$props3.onButtonReady;
var queryParams = []; // replacing camelCase with dashes
options = _this$props3.options,
onButtonReady = _this$props3.onButtonReady;
var queryParams = [];
// replacing camelCase with dashes
Object.keys(options).forEach(function (k) {

@@ -170,3 +144,2 @@ var name = k.split(/(?=[A-Z])/).join("-").toLowerCase();

script.async = true;
script.onload = function () {

@@ -176,3 +149,2 @@ _this4.setState({

});
if (onButtonReady) {

@@ -182,16 +154,9 @@ onButtonReady();

};
script.onerror = function () {
throw new Error("Paypal SDK could not be loaded.");
};
document.body.appendChild(script);
}
}]);
return PayPalButton;
}(_react["default"].Component);
exports.PayPalButton = PayPalButton;
_defineProperty(PayPalButton, "propTypes", {

@@ -204,7 +169,7 @@ amount: _propTypes["default"].oneOfType([_propTypes["default"].number, _propTypes["default"].string]),

onError: _propTypes["default"].func,
onCancel: _propTypes["default"].func,
onClick: _propTypes["default"].func,
createOrder: _propTypes["default"].func,
createSubscription: _propTypes["default"].func,
onApprove: _propTypes["default"].func,
onCancel: _propTypes["default"].func,
onClick: _propTypes["default"].func,
style: _propTypes["default"].object,

@@ -228,3 +193,2 @@ options: _propTypes["default"].shape({

});
_defineProperty(PayPalButton, "defaultProps", {

@@ -238,2 +202,2 @@ style: {},

});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50c3giXSwibmFtZXMiOlsiUGF5UGFsQnV0dG9uIiwicHJvcHMiLCJzdGF0ZSIsImlzU2RrUmVhZHkiLCJ3aW5kb3ciLCJ1bmRlZmluZWQiLCJwYXlwYWwiLCJhZGRQYXlwYWxTZGsiLCJvbkJ1dHRvblJlYWR5IiwiZGF0YSIsImFjdGlvbnMiLCJjdXJyZW5jeSIsIm9wdGlvbnMiLCJhbW91bnQiLCJzaGlwcGluZ1ByZWZlcmVuY2UiLCJvcmRlciIsImNyZWF0ZSIsInB1cmNoYXNlX3VuaXRzIiwiY3VycmVuY3lfY29kZSIsInZhbHVlIiwidG9TdHJpbmciLCJhcHBsaWNhdGlvbl9jb250ZXh0Iiwic2hpcHBpbmdfcHJlZmVyZW5jZSIsImNhcHR1cmUiLCJ0aGVuIiwiZGV0YWlscyIsIm9uU3VjY2VzcyIsImVyciIsImNhdGNoRXJyb3IiLCJjcmVhdGVPcmRlciIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsIm9uQ2xpY2siLCJvbkNhbmNlbCIsIm9uQXBwcm92ZSIsInN0eWxlIiwiQnV0dG9uIiwiQnV0dG9ucyIsImRyaXZlciIsIlJlYWN0IiwiUmVhY3RET00iLCJjcmVhdGVPcmRlckZuIiwicXVlcnlQYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImsiLCJuYW1lIiwic3BsaXQiLCJqb2luIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwic2NyaXB0IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidHlwZSIsInNyYyIsImFzeW5jIiwib25sb2FkIiwic2V0U3RhdGUiLCJvbmVycm9yIiwiRXJyb3IiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJudW1iZXIiLCJzdHJpbmciLCJmdW5jIiwib25FcnJvciIsIm9iamVjdCIsInNoYXBlIiwiY2xpZW50SWQiLCJtZXJjaGFudElkIiwiaW50ZW50IiwiY29tbWl0IiwiYm9vbCIsInZhdWx0IiwiY29tcG9uZW50IiwiZGlzYWJsZUZ1bmRpbmciLCJkaXNhYmxlQ2FyZCIsImludGVncmF0aW9uRGF0ZSIsImxvY2FsZSIsImJ1eWVyQ291bnRyeSIsImRlYnVnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTJDTUEsWTs7Ozs7QUEyREYsd0JBQVlDLEtBQVosRUFBc0M7QUFBQTs7QUFBQTs7QUFDbEMsOEJBQU1BLEtBQU47QUFFQSxVQUFLQyxLQUFMLEdBQWE7QUFDVEMsTUFBQUEsVUFBVSxFQUFFO0FBREgsS0FBYjtBQUhrQztBQU1yQzs7OztXQUVELDZCQUFvQjtBQUNoQixVQUNJLE9BQU9DLE1BQVAsS0FBa0IsV0FBbEIsSUFDQUEsTUFBTSxLQUFLQyxTQURYLElBRUFELE1BQU0sQ0FBQ0UsTUFBUCxLQUFrQkQsU0FIdEIsRUFJRTtBQUNFLGFBQUtFLFlBQUw7QUFDSCxPQU5ELE1BT0ssSUFDRCxPQUFPSCxNQUFQLEtBQWtCLFdBQWxCLElBQ0FBLE1BQU0sS0FBS0MsU0FEWCxJQUVBRCxNQUFNLENBQUNFLE1BQVAsS0FBa0JELFNBRmxCLElBR0EsS0FBS0osS0FBTCxDQUFXTyxhQUpWLEVBS0g7QUFDRSxhQUFLUCxLQUFMLENBQVdPLGFBQVg7QUFDSDtBQUNKOzs7V0FFRCxxQkFBWUMsSUFBWixFQUF1QkMsT0FBdkIsRUFBcUM7QUFFakMsd0JBQTBELEtBQUtULEtBQS9EO0FBQUEsVUFBUVUsUUFBUixlQUFRQSxRQUFSO0FBQUEsVUFBa0JDLE9BQWxCLGVBQWtCQSxPQUFsQjtBQUFBLFVBQTJCQyxNQUEzQixlQUEyQkEsTUFBM0I7QUFBQSxVQUFtQ0Msa0JBQW5DLGVBQW1DQSxrQkFBbkM7QUFFQSxhQUFPSixPQUFPLENBQUNLLEtBQVIsQ0FBY0MsTUFBZCxDQUFxQjtBQUN4QkMsUUFBQUEsY0FBYyxFQUFFLENBQ1o7QUFDSUosVUFBQUEsTUFBTSxFQUFFO0FBQ0pLLFlBQUFBLGFBQWEsRUFBRVAsUUFBUSxHQUNqQkEsUUFEaUIsR0FFakJDLE9B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TUFBTSxFQUFFWCxzQkFBVUMsU0FBVixDQUFvQixDQUN4QkQsc0JBQVVZLElBRGMsRUFFeEJaLHNCQUFVRyxNQUZjLENBQXBCLENBUmE7QUFZckJVLElBQUFBLEtBQUssRUFBRWIsc0JBQVVDLFNBQVYsQ0FBb0IsQ0FDdkJELHNCQUFVWSxJQURhLEVBRXZCWixzQkFBVUcsTUFGYSxDQUFwQixDQVpjO0FBZ0JyQlcsSUFBQUEsU0FBUyxFQUFFZCxzQkFBVUcsTUFoQkE7QUFpQnJCWSxJQUFBQSxjQUFjLEVBQUVmLHNCQUFVRyxNQWpCTDtBQWtCckJhLElBQUFBLFdBQVcsRUFBRWhCLHNCQUFVRyxNQWxCRjtBQW1CckJjLElBQUFBLGVBQWUsRUFBRWpCLHNCQUFVRyxNQW5CTjtBQW9CckJlLElBQUFBLE1BQU0sRUFBRWxCLHNCQUFVRyxNQXBCRztBQXFCckJnQixJQUFBQSxZQUFZLEVBQUVuQixzQkFBVUcsTUFyQkg7QUFzQnJCaUIsSUFBQUEsS0FBSyxFQUFFcEIsc0JBQVVDLFNBQVYsQ0FBb0IsQ0FDdkJELHNCQUFVWSxJQURhLEVBRXZCWixzQkFBVUcsTUFGYSxDQUFwQjtBQXRCYyxHQUFoQixDQW5CTTtBQThDZjNELEVBQUFBLGFBQWEsRUFBRXdELHNCQUFVSTtBQTlDVixDOztnQkFEakJwRSxZLGtCQWtEb0I7QUFDbEJrQyxFQUFBQSxLQUFLLEVBQUUsRUFEVztBQUVsQnRCLEVBQUFBLE9BQU8sRUFBRTtBQUNMNEQsSUFBQUEsUUFBUSxFQUFFLElBREw7QUFFTDdELElBQUFBLFFBQVEsRUFBRTtBQUZMLEdBRlM7QUFNbEJHLEVBQUFBLGtCQUFrQixFQUFFO0FBTkYsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHsgcGF5cGFsOiBhbnkgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheVBhbEJ1dHRvblByb3BzIHtcbiAgICBhbW91bnQ/OiBudW1iZXJ8c3RyaW5nO1xuICAgIGN1cnJlbmN5PzogbnVtYmVyfHN0cmluZztcbiAgICBzaGlwcGluZ1ByZWZlcmVuY2U/OiBcIk5PX1NISVBQSU5HXCIgfCBcIkdFVF9GUk9NX0ZJTEVcIiB8IFwiU0VUX1BST1ZJREVEX0FERFJFU1NcIjtcbiAgICBvblN1Y2Nlc3M/OiBGdW5jdGlvbjtcbiAgICBjYXRjaEVycm9yPzogRnVuY3Rpb247XG4gICAgb25FcnJvcj86IEZ1bmN0aW9uO1xuICAgIGNyZWF0ZU9yZGVyPzogRnVuY3Rpb247XG4gICAgY3JlYXRlU3Vic2NyaXB0aW9uPzogRnVuY3Rpb247XG4gICAgb25BcHByb3ZlPzogRnVuY3Rpb247XG4gICAgc3R5bGU/OiBvYmplY3Q7XG4gICAgb3B0aW9ucz86IFBheXBhbE9wdGlvbnM7XG4gICAgb25CdXR0b25SZWFkeT86IEZ1bmN0aW9uO1xuICAgIG9uQ2xpY2s/OiBGdW5jdGlvbjtcbiAgICBvbkNhbmNlbD86IEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheVBhbEJ1dHRvblN0YXRlIHtcbiAgICBpc1Nka1JlYWR5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheXBhbE9wdGlvbnMge1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICAgIG1lcmNoYW50SWQ/OiBzdHJpbmc7XG4gICAgY3VycmVuY3k/OiBudW1iZXJ8c3RyaW5nO1xuICAgIGludGVudD86IHN0cmluZztcbiAgICBjb21taXQ/OiBib29sZWFufHN0cmluZztcbiAgICB2YXVsdD86IGJvb2xlYW58c3RyaW5nO1xuICAgIGNvbXBvbmVudD86IHN0cmluZztcbiAgICBkaXNhYmxlRnVuZGluZz86IHN0cmluZztcbiAgICBkaXNhYmxlQ2FyZD86IHN0cmluZztcbiAgICBpbnRlZ3JhdGlvbkRhdGU/OiBzdHJpbmc7XG4gICAgbG9jYWxlPzogc3RyaW5nO1xuICAgIGJ1eWVyQ291bnRyeT86IHN0cmluZztcbiAgICBkZWJ1Zz86IGJvb2xlYW58c3RyaW5nO1xufVxuXG5jbGFzcyBQYXlQYWxCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8UGF5UGFsQnV0dG9uUHJvcHMsIFBheVBhbEJ1dHRvblN0YXRlPiB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgYW1vdW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5udW1iZXIsXG4gICAgICAgICAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBdKSxcbiAgICAgICAgY3VycmVuY3k6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIF0pLFxuICAgICAgICBzaGlwcGluZ1ByZWZlcmVuY2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIG9uU3VjY2VzczogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGNhdGNoRXJyb3I6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBvbkVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgb25DYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgY3JlYXRlT3JkZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBjcmVhdGVTdWJzY3JpcHRpb246IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBvbkFwcHJvdmU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgb3B0aW9uczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgICAgIGNsaWVudElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgbWVyY2hhbnRJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgICAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGludGVudDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIGNvbW1pdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgICAgICAgICAgUHJvcFR5cGVzLnN0cmluZ1xuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB2YXVsdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgICAgICAgICAgUHJvcFR5cGVzLnN0cmluZ1xuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBjb21wb25lbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBkaXNhYmxlRnVuZGluZzogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIGRpc2FibGVDYXJkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25EYXRlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgbG9jYWxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgYnV5ZXJDb3VudHJ5OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgZGVidWc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmdcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0pLFxuICAgICAgICBvbkJ1dHRvblJlYWR5OiBQcm9wVHlwZXMuZnVuYyxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBzdHlsZToge30sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBcInNiXCIsXG4gICAgICAgICAgICBjdXJyZW5jeTogXCJVU0RcIlxuICAgICAgICB9LFxuICAgICAgICBzaGlwcGluZ1ByZWZlcmVuY2U6IFwiR0VUX0ZST01fRklMRVwiLFxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBQYXlQYWxCdXR0b25Qcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGlzU2RrUmVhZHk6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB3aW5kb3cgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgd2luZG93LnBheXBhbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5hZGRQYXlwYWxTZGsoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHdpbmRvdyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB3aW5kb3cucGF5cGFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25CdXR0b25SZWFkeVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25CdXR0b25SZWFkeSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlT3JkZXIoZGF0YTogYW55LCBhY3Rpb25zOiBhbnkpIHtcblxuICAgICAgICBjb25zdCB7IGN1cnJlbmN5LCBvcHRpb25zLCBhbW91bnQsIHNoaXBwaW5nUHJlZmVyZW5jZSB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICByZXR1cm4gYWN0aW9ucy5vcmRlci5jcmVhdGUoe1xuICAgICAgICAgICAgcHVyY2hhc2VfdW5pdHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFtb3VudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lfY29kZTogY3VycmVuY3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcHRpb25zICYmIG9wdGlvbnMuY3VycmVuY3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zLmN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJVU0RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhbW91bnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uX2NvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBzaGlwcGluZ19wcmVmZXJlbmNlOiBzaGlwcGluZ1ByZWZlcmVuY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25BcHByb3ZlKGRhdGE6IGFueSwgYWN0aW9uczogYW55KSB7XG4gICAgICAgIHJldHVybiBhY3Rpb25zLm9yZGVyXG4gICAgICAgICAgICAuY2FwdHVyZSgpXG4gICAgICAgICAgICAudGhlbigoZGV0YWlscykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm9uU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vblN1Y2Nlc3MoZGV0YWlscywgZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuY2F0Y2hFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jYXRjaEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBvblN1Y2Nlc3MsXG4gICAgICAgICAgICBjcmVhdGVPcmRlcixcbiAgICAgICAgICAgIGNyZWF0ZVN1YnNjcmlwdGlvbixcbiAgICAgICAgICAgIG9uQ2xpY2ssXG4gICAgICAgICAgICBvbkNhbmNlbCxcbiAgICAgICAgICAgIG9uQXBwcm92ZSxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgeyBpc1Nka1JlYWR5IH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc1Nka1JlYWR5ICYmXG4gICAgICAgICAgICAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCB3aW5kb3cucGF5cGFsID09PSB1bmRlZmluZWQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBCdXR0b24gPSB3aW5kb3cucGF5cGFsLkJ1dHRvbnMuZHJpdmVyKFwicmVhY3RcIiwge1xuICAgICAgICAgICAgUmVhY3QsXG4gICAgICAgICAgICBSZWFjdERPTSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlT3JkZXJGbiA9XG4gICAgICAgICAgICBhbW91bnQgJiYgIWNyZWF0ZU9yZGVyXG4gICAgICAgICAgICAgICAgPyAoZGF0YTogYW55LCBhY3Rpb25zOiBhbnkpID0+IHRoaXMuY3JlYXRlT3JkZXIoZGF0YSwgYWN0aW9ucylcbiAgICAgICAgICAgICAgICA6IChkYXRhOiBhbnksIGFjdGlvbnM6IGFueSkgPT4gY3JlYXRlT3JkZXIoZGF0YSwgYWN0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wc31cbiAgICAgICAgICAgICAgICBjcmVhdGVPcmRlcj17Y3JlYXRlU3Vic2NyaXB0aW9uID8gdW5kZWZpbmVkIDogY3JlYXRlT3JkZXJGbn1cbiAgICAgICAgICAgICAgICBjcmVhdGVTdWJzY3JpcHRpb249e2NyZWF0ZVN1YnNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICBvbkFwcHJvdmU9e1xuICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGRhdGE6IGFueSwgYWN0aW9uczogYW55KSA9PiB0aGlzLm9uQXBwcm92ZShkYXRhLCBhY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGF0YTogYW55LCBhY3Rpb25zOiBhbnkpID0+IG9uQXBwcm92ZShkYXRhLCBhY3Rpb25zKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsPXtvbkNhbmNlbH1cbiAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkUGF5cGFsU2RrKCkge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMsIG9uQnV0dG9uUmVhZHkgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIHJlcGxhY2luZyBjYW1lbENhc2Ugd2l0aCBkYXNoZXNcbiAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBrLnNwbGl0KC8oPz1bQS1aXSkvKS5qb2luKFwiLVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChgJHtuYW1lfT0ke29wdGlvbnNba119YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgIHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcbiAgICAgICAgc2NyaXB0LnNyYyA9IGBodHRwczovL3d3dy5wYXlwYWwuY29tL3Nkay9qcz8ke3F1ZXJ5UGFyYW1zLmpvaW4oXCImXCIpfWA7XG4gICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNTZGtSZWFkeTogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgaWYgKG9uQnV0dG9uUmVhZHkpIHtcbiAgICAgICAgICAgICAgICBvbkJ1dHRvblJlYWR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF5cGFsIFNESyBjb3VsZCBub3QgYmUgbG9hZGVkLlwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBQYXlQYWxCdXR0b24gfTtcbiJdfQ==
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdERvbSIsIl9wcm9wVHlwZXMiLCJlIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJvIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIl9leHRlbmRzIiwiT2JqZWN0IiwiYXNzaWduIiwiYmluZCIsIm4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ0IiwiciIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFwcGx5IiwiX2NsYXNzQ2FsbENoZWNrIiwiYSIsIlR5cGVFcnJvciIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsImtleSIsIl9jcmVhdGVDbGFzcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIlJlZmVyZW5jZUVycm9yIiwiQm9vbGVhbiIsInZhbHVlT2YiLCJzZXRQcm90b3R5cGVPZiIsImdldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX2luaGVyaXRzIiwiY3JlYXRlIiwidmFsdWUiLCJfc2V0UHJvdG90eXBlT2YiLCJfZGVmaW5lUHJvcGVydHkiLCJpIiwiX3RvUHJpbWl0aXZlIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJQYXlQYWxCdXR0b24iLCJleHBvcnRzIiwiX1JlYWN0JENvbXBvbmVudCIsInByb3BzIiwiX3RoaXMiLCJzdGF0ZSIsImlzU2RrUmVhZHkiLCJjb21wb25lbnREaWRNb3VudCIsIndpbmRvdyIsInVuZGVmaW5lZCIsInBheXBhbCIsImFkZFBheXBhbFNkayIsIm9uQnV0dG9uUmVhZHkiLCJjcmVhdGVPcmRlciIsImRhdGEiLCJhY3Rpb25zIiwiX3RoaXMkcHJvcHMiLCJjdXJyZW5jeSIsIm9wdGlvbnMiLCJhbW91bnQiLCJzaGlwcGluZ1ByZWZlcmVuY2UiLCJvcmRlciIsInB1cmNoYXNlX3VuaXRzIiwiY3VycmVuY3lfY29kZSIsInRvU3RyaW5nIiwiYXBwbGljYXRpb25fY29udGV4dCIsInNoaXBwaW5nX3ByZWZlcmVuY2UiLCJvbkFwcHJvdmUiLCJfdGhpczIiLCJjYXB0dXJlIiwidGhlbiIsImRldGFpbHMiLCJvblN1Y2Nlc3MiLCJlcnIiLCJjYXRjaEVycm9yIiwicmVuZGVyIiwiX3RoaXMzIiwiX3RoaXMkcHJvcHMyIiwiY3JlYXRlU3Vic2NyaXB0aW9uIiwib25DbGljayIsIm9uQ2FuY2VsIiwic3R5bGUiLCJCdXR0b24iLCJCdXR0b25zIiwiZHJpdmVyIiwiUmVhY3QiLCJSZWFjdERPTSIsImNyZWF0ZU9yZGVyRm4iLCJjcmVhdGVFbGVtZW50IiwiX3RoaXM0IiwiX3RoaXMkcHJvcHMzIiwicXVlcnlQYXJhbXMiLCJrZXlzIiwiZm9yRWFjaCIsImsiLCJuYW1lIiwic3BsaXQiLCJqb2luIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwiY29uY2F0Iiwic2NyaXB0IiwiZG9jdW1lbnQiLCJ0eXBlIiwic3JjIiwiYXN5bmMiLCJvbmxvYWQiLCJzZXRTdGF0ZSIsIm9uZXJyb3IiLCJFcnJvciIsImJvZHkiLCJhcHBlbmRDaGlsZCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9uZU9mVHlwZSIsIm51bWJlciIsInN0cmluZyIsImZ1bmMiLCJvbkVycm9yIiwib2JqZWN0Iiwic2hhcGUiLCJjbGllbnRJZCIsIm1lcmNoYW50SWQiLCJpbnRlbnQiLCJjb21taXQiLCJib29sIiwidmF1bHQiLCJjb21wb25lbnQiLCJkaXNhYmxlRnVuZGluZyIsImRpc2FibGVDYXJkIiwiaW50ZWdyYXRpb25EYXRlIiwibG9jYWxlIiwiYnV5ZXJDb3VudHJ5IiwiZGVidWciXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHsgcGF5cGFsOiBhbnkgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheVBhbEJ1dHRvblByb3BzIHtcbiAgICBhbW91bnQ/OiBudW1iZXJ8c3RyaW5nLFxuICAgIGN1cnJlbmN5PzogbnVtYmVyfHN0cmluZyxcbiAgICBzaGlwcGluZ1ByZWZlcmVuY2U/OiBcIk5PX1NISVBQSU5HXCIgfCBcIkdFVF9GUk9NX0ZJTEVcIiB8IFwiU0VUX1BST1ZJREVEX0FERFJFU1NcIixcbiAgICBvblN1Y2Nlc3M/OiBGdW5jdGlvbixcbiAgICBjYXRjaEVycm9yPzogRnVuY3Rpb24sXG4gICAgb25FcnJvcj86IEZ1bmN0aW9uLFxuICAgIGNyZWF0ZU9yZGVyPzogRnVuY3Rpb24sXG4gICAgY3JlYXRlU3Vic2NyaXB0aW9uPzogRnVuY3Rpb24sXG4gICAgb25BcHByb3ZlPzogRnVuY3Rpb24sXG4gICAgc3R5bGU/OiBvYmplY3QsXG4gICAgb3B0aW9ucz86IFBheXBhbE9wdGlvbnMsXG4gICAgb25CdXR0b25SZWFkeT86IEZ1bmN0aW9uLFxuICAgIG9uQ2FuY2VsPzogRnVuY3Rpb24sXG4gICAgb25DbGljaz86IEZ1bmN0aW9uLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheVBhbEJ1dHRvblN0YXRlIHtcbiAgICBpc1Nka1JlYWR5OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cGFsT3B0aW9ucyB7XG4gICAgY2xpZW50SWQ/OiBzdHJpbmcsXG4gICAgbWVyY2hhbnRJZD86IHN0cmluZyxcbiAgICBjdXJyZW5jeT86IG51bWJlcnxzdHJpbmcsXG4gICAgaW50ZW50Pzogc3RyaW5nLFxuICAgIGNvbW1pdD86IGJvb2xlYW58c3RyaW5nLFxuICAgIHZhdWx0PzogYm9vbGVhbnxzdHJpbmcsXG4gICAgY29tcG9uZW50Pzogc3RyaW5nLFxuICAgIGRpc2FibGVGdW5kaW5nPzogc3RyaW5nLFxuICAgIGRpc2FibGVDYXJkPzogc3RyaW5nLFxuICAgIGludGVncmF0aW9uRGF0ZT86IHN0cmluZyxcbiAgICBsb2NhbGU/OiBzdHJpbmcsXG4gICAgYnV5ZXJDb3VudHJ5Pzogc3RyaW5nLFxuICAgIGRlYnVnPzogYm9vbGVhbnxzdHJpbmdcbn1cblxuY2xhc3MgUGF5UGFsQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PFBheVBhbEJ1dHRvblByb3BzLCBQYXlQYWxCdXR0b25TdGF0ZT4ge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIGFtb3VudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICAgICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgXSksXG4gICAgICAgIGN1cnJlbmN5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5udW1iZXIsXG4gICAgICAgICAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBdKSxcbiAgICAgICAgc2hpcHBpbmdQcmVmZXJlbmNlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBvblN1Y2Nlc3M6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBjYXRjaEVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgb25FcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGNyZWF0ZU9yZGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgY3JlYXRlU3Vic2NyaXB0aW9uOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgb25BcHByb3ZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgb25DYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIG9wdGlvbnM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICBjbGllbnRJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIG1lcmNoYW50SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBjdXJyZW5jeTogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICAgICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICAgICAgICAgICAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBpbnRlbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBjb21taXQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmdcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgdmF1bHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmdcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgZGlzYWJsZUZ1bmRpbmc6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBkaXNhYmxlQ2FyZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIGludGVncmF0aW9uRGF0ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIGxvY2FsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIGJ1eWVyQ291bnRyeTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIGRlYnVnOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgICAgICBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgICAgICAgICBQcm9wVHlwZXMuc3RyaW5nXG4gICAgICAgICAgICBdKVxuICAgICAgICB9KSxcbiAgICAgICAgb25CdXR0b25SZWFkeTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgc3R5bGU6IHt9LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjbGllbnRJZDogXCJzYlwiLFxuICAgICAgICAgICAgY3VycmVuY3k6IFwiVVNEXCJcbiAgICAgICAgfSxcbiAgICAgICAgc2hpcHBpbmdQcmVmZXJlbmNlOiBcIkdFVF9GUk9NX0ZJTEVcIixcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogUGF5UGFsQnV0dG9uUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1Nka1JlYWR5OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgd2luZG93ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHdpbmRvdy5wYXlwYWwgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUGF5cGFsU2RrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB3aW5kb3cgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgd2luZG93LnBheXBhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQnV0dG9uUmVhZHlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQnV0dG9uUmVhZHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZU9yZGVyKGRhdGE6IGFueSwgYWN0aW9uczogYW55KSB7XG5cbiAgICAgICAgY29uc3QgeyBjdXJyZW5jeSwgb3B0aW9ucywgYW1vdW50LCBzaGlwcGluZ1ByZWZlcmVuY2UgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgcmV0dXJuIGFjdGlvbnMub3JkZXIuY3JlYXRlKHtcbiAgICAgICAgICBwdXJjaGFzZV91bml0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhbW91bnQ6IHtcbiAgICAgICAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeVxuICAgICAgICAgICAgICAgICAgPyBjdXJyZW5jeVxuICAgICAgICAgICAgICAgICAgOiBvcHRpb25zICYmIG9wdGlvbnMuY3VycmVuY3lcbiAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5jdXJyZW5jeVxuICAgICAgICAgICAgICAgICAgOiBcIlVTRFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBhbW91bnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBhcHBsaWNhdGlvbl9jb250ZXh0OiB7XG4gICAgICAgICAgICBzaGlwcGluZ19wcmVmZXJlbmNlOiBzaGlwcGluZ1ByZWZlcmVuY2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQXBwcm92ZShkYXRhOiBhbnksIGFjdGlvbnM6IGFueSkge1xuICAgICAgICByZXR1cm4gYWN0aW9ucy5vcmRlclxuICAgICAgICAgICAgLmNhcHR1cmUoKVxuICAgICAgICAgICAgLnRoZW4oKGRldGFpbHMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5vblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25TdWNjZXNzKGRldGFpbHMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmNhdGNoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2F0Y2hFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgb25TdWNjZXNzLFxuICAgICAgICAgICAgY3JlYXRlT3JkZXIsXG4gICAgICAgICAgICBjcmVhdGVTdWJzY3JpcHRpb24sXG4gICAgICAgICAgICBvbkFwcHJvdmUsXG4gICAgICAgICAgICBvbkNsaWNrLFxuICAgICAgICAgICAgb25DYW5jZWwsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHsgaXNTZGtSZWFkeSB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNTZGtSZWFkeSAmJlxuICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgd2luZG93LnBheXBhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQnV0dG9uID0gd2luZG93LnBheXBhbC5CdXR0b25zLmRyaXZlcihcInJlYWN0XCIsIHtcbiAgICAgICAgICAgIFJlYWN0LFxuICAgICAgICAgICAgUmVhY3RET00sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZU9yZGVyRm4gPVxuICAgICAgICAgICAgYW1vdW50ICYmICFjcmVhdGVPcmRlclxuICAgICAgICAgICAgICAgID8gKGRhdGE6IGFueSwgYWN0aW9uczogYW55KSA9PiB0aGlzLmNyZWF0ZU9yZGVyKGRhdGEsIGFjdGlvbnMpXG4gICAgICAgICAgICAgICAgOiAoZGF0YTogYW55LCBhY3Rpb25zOiBhbnkpID0+IGNyZWF0ZU9yZGVyKGRhdGEsIGFjdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAgICAgICAgICAgY3JlYXRlT3JkZXI9e2NyZWF0ZVN1YnNjcmlwdGlvbiA/IHVuZGVmaW5lZCA6IGNyZWF0ZU9yZGVyRm59XG4gICAgICAgICAgICAgICAgY3JlYXRlU3Vic2NyaXB0aW9uPXtjcmVhdGVTdWJzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgb25BcHByb3ZlPXtcbiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChkYXRhOiBhbnksIGFjdGlvbnM6IGFueSkgPT4gdGhpcy5vbkFwcHJvdmUoZGF0YSwgYWN0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGRhdGE6IGFueSwgYWN0aW9uczogYW55KSA9PiBvbkFwcHJvdmUoZGF0YSwgYWN0aW9ucylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb25DYW5jZWw9e29uQ2FuY2VsfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFBheXBhbFNkaygpIHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25zLCBvbkJ1dHRvblJlYWR5IH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyByZXBsYWNpbmcgY2FtZWxDYXNlIHdpdGggZGFzaGVzXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gay5zcGxpdCgvKD89W0EtWl0pLykuam9pbihcIi1cIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYCR7bmFtZX09JHtvcHRpb25zW2tdfWApO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XG4gICAgICAgIHNjcmlwdC5zcmMgPSBgaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9zZGsvanM/JHtxdWVyeVBhcmFtcy5qb2luKFwiJlwiKX1gO1xuICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzU2RrUmVhZHk6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIGlmIChvbkJ1dHRvblJlYWR5KSB7XG4gICAgICAgICAgICAgICAgb25CdXR0b25SZWFkeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBheXBhbCBTREsgY291bGQgbm90IGJlIGxvYWRlZC5cIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUGF5UGFsQnV0dG9uIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElB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
{
"name": "@repeatgg/react-paypal-button-v2",
"version": "2.7.1",
"version": "2.7.2",
"description": "An easy and simple to use React button component to implement PayPal's Checkout with Smart Payment Buttons V2 (Version 2).",

@@ -19,8 +19,13 @@ "keywords": [

"checkout-buttons",
"paypal buttons"
"paypal buttons",
"LueHsoft",
"LueH LABS",
"Lue Hang",
"luehang"
],
"homepage": "https://github.com/repeatgg/react-paypal-button-v2",
"homepage": "https://luehangs.site/lue_hang/projects/react-paypal-button-v2",
"author": {
"name": "Repeat.gg",
"url": "https://repeat.gg"
"name": "Lue Hang",
"email": "lue_hang@hotmail.com",
"url": "https://www.luehangs.site"
},

@@ -39,51 +44,57 @@ "repository": {

},
"private": false,
"main": "./lib/index.js",
"types": "dist/index.d.ts",
"dependencies": {
"prop-types": "^15.7.2"
"prop-types": "^15.7.2",
"rimraf": "^3.0.2"
},
"peerDependencies": {
"react": "16.x.x || 17.x.x",
"react-dom": "16.x.x || 17.x.x"
"react": "^0.14.6 || 15.x.x || 16.x.x || ^17.0.0 || ^18.0.0",
"react-dom": "^0.14.6 || 15.x.x || 16.x.x || ^17.0.0 || ^18.0.0"
},
"devDependencies": {
"@babel/cli": "^7.5.5",
"@babel/core": "^7.5.5",
"@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/plugin-proposal-object-rest-spread": "^7.5.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/preset-env": "^7.5.5",
"@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.3.3",
"@types/node": "^14.14.3",
"@types/react": "^16.9.2",
"@types/react-dom": "^16.8.5",
"@babel/cli": "^7.12.1",
"@babel/core": "^7.12.3",
"@babel/plugin-proposal-class-properties": "^7.12.1",
"@babel/plugin-proposal-object-rest-spread": "^7.12.1",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "^7.12.1",
"@babel/preset-react": "^7.12.1",
"@babel/preset-typescript": "^7.12.1",
"@types/enzyme": "^3.10.7",
"@types/enzyme-adapter-react-16": "^1.0.6",
"@types/jest": "^26.0.15",
"@types/node": "^14.11.11",
"@types/react": "^16.9.53",
"@types/react-dom": "^16.9.8",
"@types/webpack-env": "^1.15.3",
"@typescript-eslint/eslint-plugin": "1.4.0",
"@typescript-eslint/parser": "1.4.0",
"@typescript-eslint/eslint-plugin": "^4.5.0",
"@typescript-eslint/parser": "^4.5.0",
"babel-core": "^6.26.3",
"babel-eslint": "^10.0.1",
"babel-jest": "^24.1.0",
"babel-loader": "^8.0.5",
"cross-env": "^5.2.0",
"css-loader": "^2.1.0",
"eslint": "^5.9.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-jsx-a11y": "^6.1.2",
"eslint-plugin-react": "^7.11.1",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.5.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"babel-eslint": "^10.1.0",
"babel-jest": "^26.6.0",
"babel-loader": "^8.1.0",
"cross-env": "^7.0.2",
"css-loader": "^5.0.0",
"enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.5",
"enzyme-to-json": "^3.6.1",
"eslint": "^7.11.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-react": "^7.21.5",
"html-webpack-plugin": "^4.5.0",
"jest": "^26.6.0",
"mini-css-extract-plugin": "^1.1.0",
"optimize-css-assets-webpack-plugin": "^5.0.4",
"path": "^0.12.7",
"react": "^16.8.2",
"react-dom": "^16.8.2",
"rimraf": "^3.0.0",
"source-map-loader": "^0.2.4",
"style-loader": "^0.23.1",
"typescript": "^3.3.3",
"uglifyjs-webpack-plugin": "^2.1.1",
"webpack": "^4.29.4",
"webpack-cli": "^3.2.3",
"webpack-dev-server": "^3.1.14"
"react": "^16.14.0",
"react-dom": "^16.14.0",
"source-map-loader": "^1.1.1",
"style-loader": "^2.0.0",
"typescript": "^4.0.3",
"uglifyjs-webpack-plugin": "^2.2.0",
"webpack": "^5.1.3",
"webpack-cli": "^4.1.0",
"webpack-dev-server": "^3.11.0"
},

@@ -94,6 +105,11 @@ "scripts": {

"build:js": "babel src --out-dir lib --extensions \".tsx\" --ignore \"**/*.test.tsx\" --source-maps inline",
"build:bundle": "webpack-cli --config ./webpack.config.js --mode production",
"start": "webpack-dev-server --config ./example/webpack.config.js --mode development --open --hot",
"lint": "eslint ./src/* ./example/*"
"lint": "./node_modules/.bin/eslint src/ example/",
"test": "jest --watchAll",
"test:once": "jest",
"prepare": "npm run build",
"coverage": "jest --coverage && cat ./coverage/lcov.info | coveralls"
},
"license": "MIT"
}
+214
-121

@@ -1,42 +0,67 @@

# react-paypal-button-v2
# Repeat Fork of [react-paypal-button-2](https://github.com/Luehang/react-paypal-button-v2)
A React component to provide an interface into the Paypal Checkout API.
Forked so that we could implement onCancel and onClick. A PR exists in the original repository for this already, however it doesn't look like being merged any time soon, so we will maintain this in the meantime.
## Acknowledgements:
# :large_blue_diamond: react-paypal-button-v2
[Luehang](https://github.com/luehang): This component is a fork of his [existing component](https://github.com/Luehang/react-paypal-button-v2).
<img src="paypal-smart-buttons.png" width="200px" />
> An easy and simple to use React button component to implement PayPal&#39;s Checkout with Smart Payment Buttons V2 (Version 2).
> Check out the [docs](https://luehangs.site/lue_hang/projects/react-paypal-button-v2) for a complete documentation.
:information_source: This PayPal Checkout integration uses the PayPal JavaScript SDK. Starting at the beginning of February 2019, all new users must use PayPal's version 2 integration as version 1 is now depreciated.
<br/>
<br/>
<br/>
<a href="https://luehangs.site"><img src="https://luehangs.site/images/lh-blog-strip.jpg" alt="LueHsoft LueH LABS Lue Hang luehang"/></a>
<br/>
<br/>
<br/>
# Index
1. [Prerequisites](#prerequisites)
2. [Install](#install)
3. [Usage Example](#usage-example)
4. [Production Example](#production-example)
5. [API](#api)
6. [Props](#props)
7. [`options` Prop Fieldnames/Parameters](#small_blue_diamond-options-prop-fieldnames-or-parameters)
8. [Alternative Usage Example](#alternative-usage-example)
9. [Alternative Production Example](#alternative-production-example)
10. [Example Project](#example-project)
11. [Contribute](#contribute)
12. [License](#license)
### 1. [Prerequisites](#large_blue_diamond-prerequisites)
### 2. [Install](#large_blue_diamond-install)
### 3. [Usage Example](#large_blue_diamond-usage-example)
### 4. [Production Example](#large_blue_diamond-production-example)
### 5. [API](#large_blue_diamond-api)
### 6. :books: [Props](#large_blue_diamond-props)
### 7. [`options` Prop Fieldnames/Parameters](#small_blue_diamond-options-prop-fieldnames-or-parameters)
### 8. [Alternative Usage Example](#large_blue_diamond-alternative-usage-example)
### 9. [Alternative Production Example](#large_blue_diamond-alternative-production-example)
### 10. [Example Project](#large_blue_diamond-example-project)
### 11. [Contribute](#large_blue_diamond-contribute)
### 12. [License](#large_blue_diamond-license)
<br/>
<br/>
<br/>
---
<br/>
<br/>
<br/>
## Prerequisites
## :large_blue_diamond: Prerequisites
To use PayPal's Smart Payment Buttons in prodution, you must have a PayPal
Business account set up and verified. After this is done, you'll have access to
your API credentials to use with this button.
To use PayPal's Smart Payment Buttons in prodution, you must have a PayPal Business account set up and verified. After this is done, you'll have access to your API credentials to use with this button.
Once you have your account set up, you will have 2 different sets of credentials
for sandbox mode and production mode. You will also be able to create sandbox
business and customer accounts to be tested on.
Once you have your account set up, you will have 2 different sets of credentials for sandbox mode and production mode. You will also be able to create sandbox business and customer accounts to be tested on.
## Install
<br/>
<br/>
<br/>
<a href="https://luehangs.site/marketplace/product/RN%20Posting%20Demo%20App%20Kit"><img src="https://luehangs.site/images/lh-mobile-strip.jpg" alt="LueHsoft LueH LABS Lue Hang luehang"/></a>
<br/>
<br/>
<br/>
Type in the following to the command line to install the dependency.
## :large_blue_diamond: Install
Type in the following to the command line to install the dependency.
```sh
$ npm install @repeatgg/react-paypal-button-v2 --save
$ npm install react-paypal-button-v2 --save
```

@@ -47,15 +72,22 @@

```sh
$ yarn add @repeatgg/react-paypal-button-v2
$ yarn add react-paypal-button-v2
```
<br/>
<br/>
<br/>
---
<br/>
<br/>
<br/>
## Usage Example
## :large_blue_diamond: Usage Example
Add an `import` to the top of the file. **At minimal**, declare the
`PayPalButton` component in the `render()` method providing a string for the
`amount` prop and a function to the `onSuccess` prop.
Add an ``import`` to the top of the file. **At minimal**, declare the ``PayPalButton`` component in the ``render()`` method providing a string for the `amount` prop and a function to the `onSuccess` prop.
> If you like [`react-paypal-button-v2`](https://github.com/Luehang/react-paypal-button-v2), please be sure to give it a star at [GitHub](https://github.com/Luehang/react-paypal-button-v2). Thanks.
```javascript
import { PayPalButton } from "@repeatgg/react-paypal-button-v2";
import { PayPalButton } from "react-paypal-button-v2";

@@ -85,9 +117,21 @@ export default class Example Component {

For alternative usage, go to the [Alternative Usage Example Section](#large_blue_diamond-alternative-usage-example).
To create subscriptions, go to the [Subscriptions Example Section](#subscription-example-usage).
<br/>
<br/>
<br/>
---
<br/>
<br/>
<br/>
## Production Example
## :large_blue_diamond: Production Example
**At minimal**, declare the `options` prop and include your business
**production Client ID** in the `clientId` fieldname value.
**At minimal**, declare the `options` prop and include your business **production Client ID** in the `clientId` fieldname value.
> If you like [`react-paypal-button-v2`](https://github.com/Luehang/react-paypal-button-v2), please be sure to give it a star at [GitHub](https://github.com/Luehang/react-paypal-button-v2). Thanks.
```javascript

@@ -122,67 +166,82 @@ import { PayPalButton } from "react-paypal-button-v2";

For alternative usage, go to the
[Alternative Production Example Section](#alternative-production-example).
For alternative usage, go to the [Alternative Production Example Section](#large_blue_diamond-alternative-production-example).
To create subscriptions, go to the
[Subscriptions Example Section](#subscription-example-usage).
To create subscriptions, go to the [Subscriptions Example Section](#subscription-example-usage).
## API
<br/>
<br/>
<a href="https://luehangs.site/marketplace/product/RN%20Posting%20Demo%20App%20Kit"><img src="https://luehangs.site/images/lh-mobile-strip.jpg" alt="LueHsoft LueH LABS Lue Hang luehang"/></a>
<br/>
<br/>
`<PayPalButton />` component accepts the following props...
## :large_blue_diamond: API
# Props
``<PayPalButton />`` component accepts the following props...
| Props | Description | Type | Default |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | ----------------------------------- |
| `amount` | The amount value of the transaction. | `string` or `number` | |
| `currency` | The currency of the transaction. | `string` | "USD" |
| `shippingPreference` | The shipping preference: Displays the shipping address to the customer. Enables the customer to choose an address on the PayPal site. Restricts the customer from changing the address during the payment-approval process. Options: `NO_SHIPPING`, `GET_FROM_FILE`, `SET_PROVIDED_ADDRESS` | `string` | "NO_SHIPPING" |
| `onSuccess` | The successful completion of the transaction. `(details: object, data: object) => void` | `Function` | |
| `catchError` | Transaction declined or errored. `(err: object) => void` | `Function` | |
| `options` | You can customize the integration by passing different query parameters/fieldnames into the `options` prop object which will pass it to `https://paypal.com/sdk/js`. These parameters help PayPal decide the optimal funding sources and buttons to show to your buyers. **Before configuring the `options` prop, make sure you haven't manually added the script tag for `https://paypal.com/sdk/js`.** For a list of parameters/fieldnames, go to section [`options` Prop Fieldnames/Parameters](#small_blue_diamond-options-prop-fieldnames-or-parameters). | `object` | `{clientId: "sb", currency: "USD"}` |
| `onButtonReady` | A function called when PayPal's API is loaded. `() => void` | `Function` | |
| `onError` | If an error prevents buyer checkout. This error handler is a catch-all. Errors at this point are not expected to be handled beyond showing a generic error message or page. `(err: object) => void` | `Function` | |
| `createOrder` | A function called when the buyer clicks the PayPal button. Calls PayPal using the `actions.order.create()` to set up the details of the transaction. `(data: object, actions: object) => void` | `Function` | |
| `onApprove` | A function called when the buyer approves the transaction on paypal.com. Calls PayPal using the `actions.order.capture()` to capture the funds from the transaction. Optionally calls PayPal using `actions.order.get()` to get the transaction details. `(data: object, actions: object) => void` | `Function` | |
| `createSubscription` | A function that calls the PayPal subscription using the `actions.subscription.create()` to set up the details of the transaction. [Subscriptions Example Section](#subscription-example-usage). `(data: object, actions: object) => void` | `Function` | |
| `style` | PayPal Checkout offers several style options that you can use to customize the look and feel of your Smart Payment Button. You can also display multiple funding sources to the buyer, when appropriate. See more on what to input in the style object at [Customize the PayPal Buttons page](https://developer.paypal.com/docs/checkout/integration-features/customize-button/). | `object` | {} |
| `onShippingChange` | A function called when the buyer initially logs into their account, submits their billing/payment information, or makes a change to their shipping address on the review your payment page. `(data: { paymentToken: string, shipping_address: object, selected_shipping_method: string }, actions: { resolve: Function, reject: Function, order: Function }) => Function` | `Function` | |
| `onCancel` | Show a cancellation page or return to the shopping cart. `(data: object) => void` | `Function` | |
<br/>
:information_source: Learn more about the integration proccess along with more
props and advance use cases starting at
[PayPal's docs](https://developer.paypal.com/docs/checkout/integrate/).
# :large_blue_diamond: Props
| Props | Description | Type | Default |
|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|---------|
| `amount` | The amount value of the transaction. | `string` or `number` | |
| `currency` | The currency of the transaction. | `string` | "USD" |
| `shippingPreference` | The shipping preference: Displays the shipping address to the customer. Enables the customer to choose an address on the PayPal site. Restricts the customer from changing the address during the payment-approval process. Options: `NO_SHIPPING`, `GET_FROM_FILE`, `SET_PROVIDED_ADDRESS` | `string` | "NO_SHIPPING" |
| `onSuccess` | The successful completion of the transaction. `(details: object, data: object) => void` | `Function` | |
| `catchError` | Transaction declined or errored. `(err: object) => void` | `Function` | |
| `options` | You can customize the integration by passing different query parameters/fieldnames into the `options` prop object which will pass it to `https://paypal.com/sdk/js`. These parameters help PayPal decide the optimal funding sources and buttons to show to your buyers. **Before configuring the `options` prop, make sure you haven't manually added the script tag for `https://paypal.com/sdk/js`.** For a list of parameters/fieldnames, go to section [`options` Prop Fieldnames/Parameters](#small_blue_diamond-options-prop-fieldnames-or-parameters). | `object` | `{clientId: "sb", currency: "USD"}` |
| `onButtonReady` | A function called when PayPal's API is loaded. `() => void` | `Function` | |
| `onError` | If an error prevents buyer checkout. This error handler is a catch-all. Errors at this point are not expected to be handled beyond showing a generic error message or page. `(err: object) => void` | `Function` | |
| `createOrder` | A function called when the buyer clicks the PayPal button. Calls PayPal using the `actions.order.create()` to set up the details of the transaction. `(data: object, actions: object) => void` | `Function` | |
| `onApprove` | A function called when the buyer approves the transaction on paypal.com. Calls PayPal using the `actions.order.capture()` to capture the funds from the transaction. Optionally calls PayPal using `actions.order.get()` to get the transaction details. `(data: object, actions: object) => void` | `Function` | |
| `createSubscription` | A function that calls the PayPal subscription using the `actions.subscription.create()` to set up the details of the transaction. [Subscriptions Example Section](#subscription-example-usage). `(data: object, actions: object) => void` | `Function` | |
| `style` | PayPal Checkout offers several style options that you can use to customize the look and feel of your Smart Payment Button. You can also display multiple funding sources to the buyer, when appropriate. See more on what to input in the style object at [Customize the PayPal Buttons page](https://developer.paypal.com/docs/checkout/integration-features/customize-button/). | `object` | {} |
| `onShippingChange` | A function called when the buyer initially logs into their account, submits their billing/payment information, or makes a change to their shipping address on the review your payment page. `(data: { paymentToken: string, shipping_address: object, selected_shipping_method: string }, actions: { resolve: Function, reject: Function, order: Function }) => Function` | `Function` | |
| `onCancel` | Show a cancellation page or return to the shopping cart. `(data: object) => void` | `Function` | |
:information_source: Learn more about the integration proccess along with more props and advance use cases starting at [PayPal's docs](https://developer.paypal.com/docs/checkout/integrate/).
<br/>
<br/>
<br/>
---
<br/>
<br/>
<br/>
## `options` Prop Fieldnames or Parameters
## :small_blue_diamond: `options` Prop Fieldnames or Parameters
You can customize the integration by passing different query
parameters/fieldnames into the `options` prop object which will pass it to
`https://paypal.com/sdk/js`. These parameters help PayPal decide the optimal
funding sources and buttons to show to your buyers. **Before configuring the
`options` prop, make sure you haven't manually added the script tag for
`https://paypal.com/sdk/js`.**
You can customize the integration by passing different query parameters/fieldnames into the `options` prop object which will pass it to `https://paypal.com/sdk/js`. These parameters help PayPal decide the optimal funding sources and buttons to show to your buyers. **Before configuring the `options` prop, make sure you haven't manually added the script tag for `https://paypal.com/sdk/js`.**
| Option | Description | Type | Default |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ----------- |
| `clientId` | Your PayPal REST client ID. While you're testing in sandbox, you can use `client-id=sb` as a shortcut. | `string` | `"sb"` |
| `currency` | The currency of the transaction. | `string` | `"USD"` |
| `merchantId` | The merchant for who you are facilitating a transaction. | `string` | automatic |
| `intent` | The intent of the payment. | `string` | `"capture"` |
| `commit` | Set to `true` if the transaction is Pay Now, or `false` if the amount captured changes after the buyer returns to your site. | `boolean` or `string` | `true` |
| `vault` | Set to `true` if the transaction sets up a billing agreement, or uses a vault. | `boolean` or `string` | `false` |
| `components` | A comma-separated list of components to enable. Defaults to allow Smart Payment Buttons. Other components are optional. | `string` | `buttons` |
| `disableFunding` | Funding sources to disallow from showing in the Smart Payment Buttons. | `string` | none |
| `disableCard` | Cards to disable from showing in the Smart Payment Buttons. | `string` | none |
| `integrationDate` | The date of integration. Used to ensure backwards compatibility. | `string` | automatic |
| `locale` | The locale used to localize any components. PayPal recommends not setting this parameter, as the buyer's locale is automatically set by PayPal. | `string` | automatic |
| `buyerCountry` | The buyer country. For testing purposes only. | `string` | automatic |
| `debug` | Enable debug mode for ease of debugging. Do not enable for production traffic. | `boolean` or `string` | `false` |
Option | Description | Type | Default
------ | ------ | ------ | ------
`clientId` | Your PayPal REST client ID. While you're testing in sandbox, you can use `client-id=sb` as a shortcut. | `string` | `"sb"`
`currency` | The currency of the transaction. | `string` | `"USD"`
`merchantId` | The merchant for who you are facilitating a transaction. | `string` | automatic
`intent` | The intent of the payment. | `string` | `"capture"`
`commit` | Set to `true` if the transaction is Pay Now, or `false` if the amount captured changes after the buyer returns to your site. | `boolean` or `string` | `true`
`vault` | Set to `true` if the transaction sets up a billing agreement, or uses a vault. | `boolean` or `string` | `false`
`components` | A comma-separated list of components to enable. Defaults to allow Smart Payment Buttons. Other components are optional. | `string` | `buttons`
`disableFunding` | Funding sources to disallow from showing in the Smart Payment Buttons. | `string` | none
`disableCard` | Cards to disable from showing in the Smart Payment Buttons. | `string` | none
`integrationDate` | The date of integration. Used to ensure backwards compatibility. | `string` | automatic
`locale` | The locale used to localize any components. PayPal recommends not setting this parameter, as the buyer's locale is automatically set by PayPal. | `string` | automatic
`buyerCountry` | The buyer country. For testing purposes only. | `string` | automatic
`debug` | Enable debug mode for ease of debugging. Do not enable for production traffic. | `boolean` or `string` | `false`
To see a detail and complete list of available parameters and values, go to
[PayPal's Customization page](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).
:information_source: To see a detail and complete list of available parameters and values, go to [PayPal's Customization page](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).
## Alternative Usage Example
<br/>
<br/>
<br/>
<a href="https://luehangs.site/marketplace/product/RN%20Posting%20Demo%20App%20Kit"><img src="https://luehangs.site/images/lh-mobile-strip.jpg" alt="LueHsoft LueH LABS Lue Hang luehang"/></a>
<br/>
<br/>
<br/>
## :large_blue_diamond: Alternative Usage Example
<br/>
### Usage Example 1

@@ -231,7 +290,7 @@

<br/>
### Usage Example 2
Add the PayPal script to your web page, then add your sandbox or production
`client-id` to the script tag. While you're testing in sandbox, you can use
`client-id=sb` as a shortcut.
Add the PayPal script to your web page, then add your sandbox or production `client-id` to the script tag. While you're testing in sandbox, you can use `client-id=sb` as a shortcut.

@@ -244,10 +303,11 @@ ```html

| Option | Description | Type | Default |
| ----------- | ------------------------------------------------------------------------------------------------------ | -------- | ------- |
| `client-id` | Your PayPal REST client ID. While you're testing in sandbox, you can use `client-id=sb` as a shortcut. | `string` | `"sb"` |
| `currency` | The currency of the transaction. | `string` | `"USD"` |
Option | Description | Type | Default
------ | ------ | ------ | ------
`client-id` | Your PayPal REST client ID. While you're testing in sandbox, you can use `client-id=sb` as a shortcut. | `string` | `"sb"`
`currency` | The currency of the transaction. | `string` | `"USD"`
To see a detail and complete list of available parameters and values, go to
[PayPal's Customization page](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).
To see a detail and complete list of available parameters and values, go to [PayPal's Customization page](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).
<br/>
```javascript

@@ -279,10 +339,10 @@ import { PayPalButton } from "react-paypal-button-v2";

<br/>
### Subscription Example Usage
To create subscriptions you must first
[create a product](https://developer.paypal.com/docs/subscriptions/integrate/#2-create-a-product)
and
[create a plan](https://developer.paypal.com/docs/subscriptions/integrate/#3-create-a-plan)
using the PayPal REST API.
To create subscriptions you must first [create a product](https://developer.paypal.com/docs/subscriptions/integrate/#2-create-a-product) and [create a plan](https://developer.paypal.com/docs/subscriptions/integrate/#3-create-a-plan) using the PayPal REST API.
<br/>
```javascript

@@ -323,8 +383,14 @@ import { PayPalButton } from "react-paypal-button-v2";

<br/>
<br/>
<br/>
---
<br/>
<br/>
<br/>
## Alternative Production Example
## :large_blue_diamond: Alternative Production Example
**At minimal**, add the **PayPal script** to your web page, then add your
**production** `client-id` to the script tag.
**At minimal**, add the **PayPal script** to your web page, then add your **production** `client-id` to the script tag.

@@ -337,10 +403,11 @@ ```html

| Option | Description | Type | Default |
| ----------- | -------------------------------- | -------- | ------- |
| `client-id` | Your PayPal REST client ID. | `string` | `"sb"` |
| `currency` | The currency of the transaction. | `string` | `"USD"` |
Option | Description | Type | Default
------ | ------ | ------ | ------
`client-id` | Your PayPal REST client ID. | `string` | `"sb"`
`currency` | The currency of the transaction. | `string` | `"USD"`
To see a detail and complete list of available parameters and values, go to
[PayPal's Customization page](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).
To see a detail and complete list of available parameters and values, go to [PayPal's Customization page](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).
<br/>
```javascript

@@ -372,4 +439,11 @@ import { PayPalButton } from "react-paypal-button-v2";

<br/>
<br/>
<br/>
<a href="https://luehangs.site/marketplace/product/RN%20Posting%20Demo%20App%20Kit"><img src="https://luehangs.site/images/lh-mobile-strip.jpg" alt="LueHsoft LueH LABS Lue Hang luehang"/></a>
<br/>
<br/>
<br/>
## Example Project
## :large_blue_diamond: Example Project

@@ -381,12 +455,16 @@ Perform steps 1-2 to run locally:

### 1. Clone the Repo
<br/>
**Clone** `@repeatgg/react-paypal-button-v2` locally. In a terminal, run:
### :small_blue_diamond: 1. Clone the Repo
**Clone** `react-paypal-button-v2` locally. In a terminal, run:
```sh
$ git clone https://github.com/repeatgg/react-paypal-button-v2.git react-paypal-button-v2
$ git clone https://github.com/Luehang/react-paypal-button-v2.git react-paypal-button-v2
```
### 2. Install and Run
<br/>
### :small_blue_diamond: 2. Install and Run
```sh

@@ -398,16 +476,31 @@ $ cd react-paypal-button-v2/

## Contribute
<br/>
<br/>
<br/>
<a href="https://luehangs.site/marketplace/product/RN%20Posting%20Demo%20App%20Kit"><img src="https://luehangs.site/images/lh-mobile-strip.jpg" alt="LueHsoft LueH LABS Lue Hang luehang"/></a>
<br/>
<br/>
<br/>
[Pull requests](https://github.com/repeatgg/react-paypal-button-v2/pulls) are
welcomed.
## :large_blue_diamond: Contribute
### Beginners
[Pull requests](https://github.com/Luehang/react-paypal-button-v2/pulls) are welcomed.
Not sure where to start, or a beginner? Take a look at the
[issues page](https://github.com/repeatgg/react-paypal-button-v2/issues).
<br/>
### :small_blue_diamond: Beginners
Not sure where to start, or a beginner? Take a look at the [issues page](https://github.com/Luehang/react-paypal-button-v2/issues).
<br/>
<br/>
<br/>
---
<br/>
<br/>
<br/>
## License
## :large_blue_diamond: License
Apache 2.0 © [Lue Hang](https://luehangs.site), as found in the LICENSE file.