"use strict";
/**
 * @license Angular v12.0.0-next.0
 * (c) 2010-2020 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function(e){var t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function r(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");var o=e.__Zone_symbol_prefix||"__zone_symbol__";function i(e){return o+e}var a=!0===e[i("forceDuplicateZoneCheck")];if(e.Zone){if(a||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var s=function(){function t(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new l(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==O.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(t,"root",{get:function(){for(var e=t.current;e.parent;)e=e.parent;return e},enumerable:!1,configurable:!0}),Object.defineProperty(t,"current",{get:function(){return z.zone},enumerable:!1,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return C},enumerable:!1,configurable:!0}),t.__load_patch=function(o,i,s){if(void 0===s&&(s=!1),O.hasOwnProperty(o)){if(!s&&a)throw Error("Already loaded patch: "+o)}else if(!e["__Zone_disable_"+o]){var c="Zone:"+o;n(c),O[o]=i(e,t,j),r(c,c)}},Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},t.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},t.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},t.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},t.prototype.run=function(e,t,n,r){z={parent:z,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{z=z.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),z={parent:z,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{z=z.parent}},t.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");if(e.state!==m||e.type!==P&&e.type!==D){var r=e.state!=w;r&&e._transitionTo(w,b),e.runCount++;var o=C;C=e,z={parent:z,zone:this};try{e.type==D&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{e.state!==m&&e.state!==Z&&(e.type==P||e.data&&e.data.isPeriodic?r&&e._transitionTo(b,w):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(m,w,m))),z=z.parent,C=o}}},t.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(T,m);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(Z,T,m),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==T&&e._transitionTo(b,T),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new f(S,e,t,n,r,void 0))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new f(D,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new f(P,e,t,n,r,o))},t.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");e._transitionTo(E,b,w);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(Z,E),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(m,E),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},t}();s.__symbol__=i;var c,u={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,i){return e.invokeTask(n,r,o,i)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},l=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this.zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask;(r||t&&t._hasTaskZS)&&(this._hasTaskZS=r?n:u,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=u,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=u,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=u,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}return e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new s(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),(n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t))||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=S)throw new Error("Task is missing scheduleFn.");_(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(o<0)throw new Error("More tasks executed then were scheduled.");0!=r&&0!=o||this.hasTask(this.zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})},e}(),f=function(){function t(n,r,o,i,a,s){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=i,this.scheduleFn=a,this.cancelFn=s,!o)throw new Error("callback is not defined");this.callback=o;var c=this;this.invoke=n===P&&i&&i.useG?t.invokeTask:function(){return t.invokeTask.call(e,c,this,arguments)}}return t.invokeTask=function(e,t,n){e||(e=this),I++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==I&&y(),I--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!1,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(m,T)},t.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(this.type+" '"+this.source+"': can not transition to '"+e+"', expecting state '"+t+"'"+(n?" or '"+n+"'":"")+", was '"+this._state+"'.");this._state=e,e==m&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},t}(),h=i("setTimeout"),p=i("Promise"),d=i("then"),v=[],k=!1;function _(t){if(0===I&&0===v.length)if(c||e[p]&&(c=e[p].resolve(0)),c){var n=c[d];n||(n=c.then),n.call(c,y)}else e[h](y,0);t&&v.push(t)}function y(){if(!k){for(k=!0;v.length;){var e=v;v=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(e){j.onUnhandledError(e)}}}j.microtaskDrainDone(),k=!1}}var g={name:"NO ZONE"},m="notScheduled",T="scheduling",b="scheduled",w="running",E="canceling",Z="unknown",S="microTask",D="macroTask",P="eventTask",O={},j={symbol:i,currentZoneFrame:function(){return z},onUnhandledError:N,microtaskDrainDone:N,scheduleMicroTask:_,showUncaughtError:function(){return!s[i("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:N,patchMethod:function(){return N},bindArguments:function(){return[]},patchThen:function(){return N},patchMacroTask:function(){return N},patchEventPrototype:function(){return N},isIEOrEdge:function(){return!1},getGlobalObjects:function(){},ObjectDefineProperty:function(){return N},ObjectGetOwnPropertyDescriptor:function(){},ObjectCreate:function(){},ArraySlice:function(){return[]},patchClass:function(){return N},wrapWithCurrentZone:function(){return N},filterProperties:function(){return[]},attachOriginToPatched:function(){return N},_redefineProperty:function(){return N},patchCallbacks:function(){return N}},z={parent:null,zone:new s(null,null)},C=null,I=0;function N(){}r("Zone","Zone"),e.Zone=s}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var e=Object.getOwnPropertyDescriptor,t=Object.defineProperty,n=Object.getPrototypeOf,r=Array.prototype.slice,o=(Zone.__symbol__("addEventListener"),Zone.__symbol__("removeEventListener"),Zone.__symbol__(""));
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */function i(e,t){return Zone.current.wrap(e,t)}function a(e,t,n,r,o){return Zone.current.scheduleMacroTask(e,t,n,r,o)}var s=Zone.__symbol__,c="undefined"!=typeof window,u=c?window:void 0,l=c&&u||"object"==typeof self&&self||global,f=[null];function h(e,t){for(var n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=i(e[n],t+"_"+n));return e}var p="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,d=!("nw"in l)&&void 0!==l.process&&"[object process]"==={}.toString.call(l.process),v=!d&&!p&&!(!c||!u.HTMLElement),k=void 0!==l.process&&"[object process]"==={}.toString.call(l.process)&&!p&&!(!c||!u.HTMLElement),_={},y=function(e){if(e=e||l.event){var t=_[e.type];t||(t=_[e.type]=s("ON_PROPERTY"+e.type));var n,r=this||e.target||l,o=r[t];if(v&&r===u&&"error"===e.type){var i=e;!0===(n=o&&o.call(this,i.message,i.filename,i.lineno,i.colno,i.error))&&e.preventDefault()}else null==(n=o&&o.apply(this,arguments))||n||e.preventDefault();return n}};function g(n,r,o){var i=e(n,r);if(!i&&o&&e(o,r)&&(i={enumerable:!0,configurable:!0}),i&&i.configurable){var a=s("on"+r+"patched");if(!n.hasOwnProperty(a)||!n[a]){delete i.writable,delete i.value;var c=i.get,u=i.set,h=r.substr(2),p=_[h];p||(p=_[h]=s("ON_PROPERTY"+h)),i.set=function(e){var t=this;t||n!==l||(t=l),t&&(t[p]&&t.removeEventListener(h,y),u&&u.apply(t,f),"function"==typeof e?(t[p]=e,t.addEventListener(h,y,!1)):t[p]=null)},i.get=function(){var e=this;if(e||n!==l||(e=l),!e)return null;var t=e[p];if(t)return t;if(c){var o=c&&c.call(this);if(o)return i.set.call(this,o),"function"==typeof e.removeAttribute&&e.removeAttribute(r),o}return null},t(n,r,i),n[a]=!0}}}function m(e,t,n){if(t)for(var r=0;r<t.length;r++)g(e,"on"+t[r],n);else{var o=[];for(var i in e)"on"==i.substr(0,2)&&o.push(i);for(var a=0;a<o.length;a++)g(e,o[a],n)}}s("originalInstance");var T=!1;function b(t,r,o){for(var i=t;i&&!i.hasOwnProperty(r);)i=n(i);!i&&t[r]&&(i=t);var a=s(r),c=null;if(i&&(!(c=i[a])||!i.hasOwnProperty(a))&&(c=i[a]=i[r],function u(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}(i&&e(i,r)))){var l=o(c,a,r);i[r]=function(){return l(this,arguments)},E(i[r],c),T&&function f(e,t){"function"==typeof Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach((function(n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,{get:function(){return e[n]},set:function(t){(!r||r.writable&&"function"==typeof r.set)&&(e[n]=t)},enumerable:!r||r.enumerable,configurable:!r||r.configurable})}))}(c,i[r])}return c}function w(e,t,n){var r=null;function o(e){var t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},r.apply(t.target,t.args),e}r=b(e,t,(function(e){return function(t,r){var i=n(t,r);return i.cbIdx>=0&&"function"==typeof r[i.cbIdx]?a(i.name,r[i.cbIdx],i,o):e.apply(t,r)}}))}function E(e,t){e[s("OriginalDelegate")]=t}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */Zone.__load_patch("ZoneAwarePromise",(function(e,t,n){var r=Object.getOwnPropertyDescriptor,o=Object.defineProperty,i=n.symbol,a=[],s=!0===e[i("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],c=i("Promise"),u=i("then");n.onUnhandledError=function(e){if(n.showUncaughtError()){var t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=function(){for(var e=function(){var e=a.shift();try{e.zone.runGuarded((function(){if(e.throwOriginal)throw e.rejection;throw e}))}catch(e){!function r(e){n.onUnhandledError(e);try{var r=t[l];"function"==typeof r&&r.call(this,e)}catch(e){}}(e)}};a.length;)e()};var l=i("unhandledPromiseRejectionHandler");function f(e){return e&&e.then}function h(e){return e}function p(e){return D.reject(e)}var d=i("state"),v=i("value"),k=i("finally"),_=i("parentPromiseValue"),y=i("parentPromiseState");function g(e,t){return function(n){try{T(e,t,n)}catch(t){T(e,!1,t)}}}var m=i("currentTaskTrace");function T(e,r,i){var c,u=(c=!1,function e(t){return function(){c||(c=!0,t.apply(null,arguments))}});if(e===i)throw new TypeError("Promise resolved with itself");if(null===e[d]){var l=null;try{"object"!=typeof i&&"function"!=typeof i||(l=i&&i.then)}catch(t){return u((function(){T(e,!1,t)}))(),e}if(!1!==r&&i instanceof D&&i.hasOwnProperty(d)&&i.hasOwnProperty(v)&&null!==i[d])E(i),T(e,i[d],i[v]);else if(!1!==r&&"function"==typeof l)try{l.call(i,u(g(e,r)),u(g(e,!1)))}catch(t){u((function(){T(e,!1,t)}))()}else{e[d]=r;var f=e[v];if(e[v]=i,e[k]===k&&!0===r&&(e[d]=e[y],e[v]=e[_]),!1===r&&i instanceof Error){var h=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;h&&o(i,m,{configurable:!0,enumerable:!1,writable:!0,value:h})}for(var p=0;p<f.length;)Z(e,f[p++],f[p++],f[p++],f[p++]);if(0==f.length&&0==r){e[d]=0;var b=i;try{throw new Error("Uncaught (in promise): "+function w(e){return e&&e.toString===Object.prototype.toString?(e.constructor&&e.constructor.name||"")+": "+JSON.stringify(e):e?e.toString():Object.prototype.toString.call(e)}(i)+(i&&i.stack?"\n"+i.stack:""))}catch(e){b=e}s&&(b.throwOriginal=!0),b.rejection=i,b.promise=e,b.zone=t.current,b.task=t.currentTask,a.push(b),n.scheduleMicroTask()}}}return e}var w=i("rejectionHandledHandler");function E(e){if(0===e[d]){try{var n=t[w];n&&"function"==typeof n&&n.call(this,{rejection:e[v],promise:e})}catch(e){}e[d]=!1;for(var r=0;r<a.length;r++)e===a[r].promise&&a.splice(r,1)}}function Z(e,t,n,r,o){E(e);var i=e[d],a=i?"function"==typeof r?r:h:"function"==typeof o?o:p;t.scheduleMicroTask("Promise.then",(function(){try{var r=e[v],o=!!n&&k===n[k];o&&(n[_]=r,n[y]=i);var s=t.run(a,void 0,o&&a!==p&&a!==h?[]:[r]);T(n,!0,s)}catch(e){T(n,!1,e)}}),n)}var S=function(){},D=function(){function e(t){if(!(this instanceof e))throw new Error("Must be an instanceof Promise.");this[d]=null,this[v]=[];try{t&&t(g(this,!0),g(this,!1))}catch(e){T(this,!1,e)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(e){return T(new this(null),!0,e)},e.reject=function(e){return T(new this(null),!1,e)},e.race=function(e){var t,n,r=new this((function(e,r){t=e,n=r}));function o(e){t(e)}function i(e){n(e)}for(var a=0,s=e;a<s.length;a++){var c=s[a];f(c)||(c=this.resolve(c)),c.then(o,i)}return r},e.all=function(t){return e.allWithCallback(t)},e.allSettled=function(t){return(this&&this.prototype instanceof e?this:e).allWithCallback(t,{thenCallback:function(e){return{status:"fulfilled",value:e}},errorCallback:function(e){return{status:"rejected",reason:e}}})},e.allWithCallback=function(e,t){for(var n,r,o=new this((function(e,t){n=e,r=t})),i=2,a=0,s=[],c=function(e){f(e)||(e=u.resolve(e));var o=a;try{e.then((function(e){s[o]=t?t.thenCallback(e):e,0==--i&&n(s)}),(function(e){t?(s[o]=t.errorCallback(e),0==--i&&n(s)):r(e)}))}catch(e){r(e)}i++,a++},u=this,l=0,h=e;l<h.length;l++)c(h[l]);return 0==(i-=2)&&n(s),o},Object.defineProperty(e.prototype,Symbol.toStringTag,{get:function(){return"Promise"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,Symbol.species,{get:function(){return e},enumerable:!1,configurable:!0}),e.prototype.then=function(n,r){var o=this.constructor[Symbol.species];o&&"function"==typeof o||(o=this.constructor||e);var i=new o(S),a=t.current;return null==this[d]?this[v].push(a,i,n,r):Z(this,a,i,n,r),i},e.prototype.catch=function(e){return this.then(null,e)},e.prototype.finally=function(n){var r=this.constructor[Symbol.species];r&&"function"==typeof r||(r=e);var o=new r(S);o[k]=k;var i=t.current;return null==this[d]?this[v].push(i,o,n,n):Z(this,i,o,n,n),o},e}();D.resolve=D.resolve,D.reject=D.reject,D.race=D.race,D.all=D.all;var P=e[c]=e.Promise;e.Promise=D;var O=i("thenPatched");function j(e){var t=e.prototype,n=r(t,"then");if(!n||!1!==n.writable&&n.configurable){var o=t.then;t[u]=o,e.prototype.then=function(e,t){var n=this;return new D((function(e,t){o.call(n,e,t)})).then(e,t)},e[O]=!0}}return n.patchThen=j,P&&(j(P),b(e,"fetch",(function(e){return function t(e){return function(t,n){var r=e.apply(t,n);if(r instanceof D)return r;var o=r.constructor;return o[O]||j(o),r}}(e)}))),Promise[t.__symbol__("uncaughtPromiseErrors")]=a,D})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("toString",(function(e){var t=Function.prototype.toString,n=s("OriginalDelegate"),r=s("Promise"),o=s("Error"),i=function i(){if("function"==typeof this){var a=this[n];if(a)return"function"==typeof a?t.call(a):Object.prototype.toString.call(a);if(this===Promise){var s=e[r];if(s)return t.call(s)}if(this===Error){var c=e[o];if(c)return t.call(c)}}return t.call(this)};i[n]=t,Function.prototype.toString=i;var a=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":a.call(this)}})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("node_util",(function(e,t,n){n.patchOnProperties=m,n.patchMethod=b,n.bindArguments=h,n.patchMacroTask=w,function r(e){T=e}(!0)}));
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Z=!1;if("undefined"!=typeof window)try{var S=Object.defineProperty({},"passive",{get:function(){Z=!0}});window.addEventListener("test",S,S),window.removeEventListener("test",S,S)}catch(e){Z=!1}var D={useG:!0},P={},O={},j=new RegExp("^"+o+"(\\w+)(true|false)$"),z=s("propagationStopped");function C(e,t){var n=(t?t(e):e)+"false",r=(t?t(e):e)+"true",i=o+n,a=o+r;P[e]={},P[e].false=i,P[e].true=a}function I(e,t){if(!t){var n=[];for(var r in e){var o=j.exec(r),i=o&&o[1];if(i&&(!t||i===t)){var a=e[r];if(a)for(var s=0;s<a.length;s++)n.push(a[s])}}return n}var c=P[t];c||(C(t),c=P[t]);var u=e[c.false],l=e[c.true];return u?l?u.concat(l):u.slice():l?l.slice():[]}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */Zone.__load_patch("EventEmitter",(function(e){var t,r=function(e,t){return e.callback===t||e.callback.listener===t},i=function(e){return"string"==typeof e?e:e?e.toString().replace("(","_").replace(")","_"):""};try{t=require("events")}catch(e){}t&&t.EventEmitter&&function a(t){var a=function c(e,t,r){var i=r&&r.add||"addEventListener",a=r&&r.rm||"removeEventListener",c=r&&r.listeners||"eventListeners",u=r&&r.rmAll||"removeAllListeners",l=s(i),f="."+i+":",h=function(e,t,n){if(!e.isRemoved){var r=e.callback;"object"==typeof r&&r.handleEvent&&(e.callback=function(e){return r.handleEvent(e)},e.originalDelegate=r),e.invoke(e,t,[n]);var o=e.options;o&&"object"==typeof o&&o.once&&t[a].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,o)}},p=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[P[t.type].false];if(r)if(1===r.length)h(r[0],n,t);else for(var o=r.slice(),i=0;i<o.length&&(!t||!0!==t[z]);i++)h(o[i],n,t)}},v=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[P[t.type].true];if(r)if(1===r.length)h(r[0],n,t);else for(var o=r.slice(),i=0;i<o.length&&(!t||!0!==t[z]);i++)h(o[i],n,t)}};function k(t,r){if(!t)return!1;var h=!0;r&&void 0!==r.useG&&(h=r.useG);var k=r&&r.vh,_=!0;r&&void 0!==r.chkDup&&(_=r.chkDup);var y=!1;r&&void 0!==r.rt&&(y=r.rt);for(var g=t;g&&!g.hasOwnProperty(i);)g=n(g);if(!g&&t[i]&&(g=t),!g)return!1;if(g[l])return!1;var m,T=r&&r.eventNameToString,b={},w=g[l]=g[i],S=g[s(a)]=g[a],z=g[s(c)]=g[c],N=g[s(u)]=g[u];function x(e,t){return!Z&&"object"==typeof e&&e?!!e.capture:Z&&t?"boolean"==typeof e?{capture:e,passive:!0}:e?"object"==typeof e&&!1!==e.passive?Object.assign(Object.assign({},e),{passive:!0}):e:{passive:!0}:e}r&&r.prepend&&(m=g[s(r.prepend)]=g[r.prepend]);var L=h?function(e){if(!b.isExisting)return w.call(b.target,b.eventName,b.capture?v:p,b.options)}:function(e){return w.call(b.target,b.eventName,e.invoke,b.options)},R=h?function(e){if(!e.isRemoved){var t=P[e.eventName],n=void 0;t&&(n=t[e.capture?"true":"false"]);var r=n&&e.target[n];if(r)for(var o=0;o<r.length;o++)if(r[o]===e){r.splice(o,1),e.isRemoved=!0,0===r.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return S.call(e.target,e.eventName,e.capture?v:p,e.options)}:function(e){return S.call(e.target,e.eventName,e.invoke,e.options)},A=r&&r.diff?r.diff:function(e,t){var n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},F=Zone[s("UNPATCHED_EVENTS")],H=e[s("PASSIVE_EVENTS")],M=function(t,n,o,i,a,s){return void 0===a&&(a=!1),void 0===s&&(s=!1),function(){var c=this||e,u=arguments[0];r&&r.transferEventName&&(u=r.transferEventName(u));var l=arguments[1];if(!l)return t.apply(this,arguments);if(d&&"uncaughtException"===u)return t.apply(this,arguments);var f=!1;if("function"!=typeof l){if(!l.handleEvent)return t.apply(this,arguments);f=!0}if(!k||k(t,l,c,arguments)){var p=Z&&!!H&&-1!==H.indexOf(u),v=x(arguments[2],p);if(F)for(var y=0;y<F.length;y++)if(u===F[y])return p?t.call(c,u,l,v):t.apply(this,arguments);var g=!!v&&("boolean"==typeof v||v.capture),m=!(!v||"object"!=typeof v)&&v.once,w=Zone.current,E=P[u];E||(C(u,T),E=P[u]);var S,j=E[g?"true":"false"],z=c[j],I=!1;if(z){if(I=!0,_)for(y=0;y<z.length;y++)if(A(z[y],l))return}else z=c[j]=[];var N=c.constructor.name,L=O[N];L&&(S=L[u]),S||(S=N+n+(T?T(u):u)),b.options=v,m&&(b.options.once=!1),b.target=c,b.capture=g,b.eventName=u,b.isExisting=I;var R=h?D:void 0;R&&(R.taskData=b);var M=w.scheduleEventTask(S,l,R,o,i);return b.target=null,R&&(R.taskData=null),m&&(v.once=!0),(Z||"boolean"!=typeof M.options)&&(M.options=v),M.target=c,M.capture=g,M.eventName=u,f&&(M.originalDelegate=l),s?z.unshift(M):z.push(M),a?c:void 0}}};return g[i]=M(w,f,L,R,y),m&&(g.prependListener=M(m,".prependListener:",(function(e){return m.call(b.target,b.eventName,e.invoke,b.options)}),R,y,!0)),g[a]=function(){var t=this||e,n=arguments[0];r&&r.transferEventName&&(n=r.transferEventName(n));var i=arguments[2],a=!!i&&("boolean"==typeof i||i.capture),s=arguments[1];if(!s)return S.apply(this,arguments);if(!k||k(S,s,t,arguments)){var c,u=P[n];u&&(c=u[a?"true":"false"]);var l=c&&t[c];if(l)for(var f=0;f<l.length;f++){var h=l[f];if(A(h,s)){if(l.splice(f,1),h.isRemoved=!0,0===l.length&&(h.allRemoved=!0,t[c]=null,"string"==typeof n)){var p=o+"ON_PROPERTY"+n;t[p]=null}return h.zone.cancelTask(h),y?t:void 0}}return S.apply(this,arguments)}},g[c]=function(){var t=this||e,n=arguments[0];r&&r.transferEventName&&(n=r.transferEventName(n));for(var o=[],i=I(t,T?T(n):n),a=0;a<i.length;a++){var s=i[a],c=s.originalDelegate?s.originalDelegate:s.callback;o.push(c)}return o},g[u]=function(){var t=this||e,n=arguments[0];if(n){r&&r.transferEventName&&(n=r.transferEventName(n));var o=P[n];if(o){var i=o.false,s=o.true,c=t[i],l=t[s];if(c){var f=c.slice();for(d=0;d<f.length;d++)this[a].call(this,n,(h=f[d]).originalDelegate?h.originalDelegate:h.callback,h.options)}if(l)for(f=l.slice(),d=0;d<f.length;d++){var h;this[a].call(this,n,(h=f[d]).originalDelegate?h.originalDelegate:h.callback,h.options)}}}else{for(var p=Object.keys(t),d=0;d<p.length;d++){var v=p[d],k=j.exec(v),_=k&&k[1];_&&"removeListener"!==_&&this[u].call(this,_)}this[u].call(this,"removeListener")}if(y)return this},E(g[i],w),E(g[a],S),N&&E(g[u],N),z&&E(g[c],z),!0}for(var _=[],y=0;y<t.length;y++)_[y]=k(t[y],r);return _}(e,[t],{useG:!1,add:"addListener",rm:"removeListener",prepend:"prependListener",rmAll:"removeAllListeners",listeners:"listeners",chkDup:!1,rt:!0,diff:r,eventNameToString:i});a&&a[0]&&(t.on=t.addListener,t.off=t.removeListener)}(t.EventEmitter.prototype)})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("fs",(function(){var e;try{e=require("fs")}catch(e){}e&&["access","appendFile","chmod","chown","close","exists","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","link","lstat","mkdir","mkdtemp","open","read","readdir","readFile","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","write","writeFile"].filter((function(t){return!!e[t]&&"function"==typeof e[t]})).forEach((function(t){w(e,t,(function(e,n){return{name:"fs."+t,args:n,cbIdx:n.length>0?n.length-1:-1,target:e}}))}))}));
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var N=s("zoneTask");function x(e,t,n,r){var o=null,i=null;n+=r;var s={};function c(t){var n=t.data;return n.args[0]=function(){return t.invoke.apply(this,arguments)},n.handleId=o.apply(e,n.args),t}function u(t){return i.call(e,t.data.handleId)}o=b(e,t+=r,(function(n){return function(o,i){if("function"==typeof i[0]){var l={isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?i[1]||0:void 0,args:i},f=i[0];i[0]=function e(){try{return f.apply(this,arguments)}finally{l.isPeriodic||("number"==typeof l.handleId?delete s[l.handleId]:l.handleId&&(l.handleId[N]=null))}};var h=a(t,i[0],l,c,u);if(!h)return h;var p=h.data.handleId;return"number"==typeof p?s[p]=h:p&&(p[N]=h),p&&p.ref&&p.unref&&"function"==typeof p.ref&&"function"==typeof p.unref&&(h.ref=p.ref.bind(p),h.unref=p.unref.bind(p)),"number"==typeof p||p?p:h}return n.apply(e,i)}})),i=b(e,n,(function(t){return function(n,r){var o,i=r[0];"number"==typeof i?o=s[i]:(o=i&&i[N])||(o=i),o&&"string"==typeof o.type?"notScheduled"!==o.state&&(o.cancelFn&&o.data.isPeriodic||0===o.runCount)&&("number"==typeof i?delete s[i]:i&&(i[N]=null),o.zone.cancelTask(o)):t.apply(e,r)}}))}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */var L="set";Zone.__load_patch("node_timers",(function(e,t){var n=!1;try{var r=require("timers");if(e.setTimeout!==r.setTimeout&&!k){var o=r.setTimeout;r.setTimeout=function(){return n=!0,o.apply(this,arguments)};var i=e.setTimeout((function(){}),100);clearTimeout(i),r.setTimeout=o}x(r,L,"clear","Timeout"),x(r,L,"clear","Interval"),x(r,L,"clear","Immediate")}catch(e){}k||(n?(e[t.__symbol__("setTimeout")]=e.setTimeout,e[t.__symbol__("setInterval")]=e.setInterval,e[t.__symbol__("setImmediate")]=e.setImmediate):(x(e,L,"clear","Timeout"),x(e,L,"clear","Interval"),x(e,L,"clear","Immediate")))})),Zone.__load_patch("nextTick",(function(){!function e(t,n,r){var o=null;function i(e){var t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=b(t,n,(function(e){return function(t,n){var o=r(t,n);return o.cbIdx>=0&&"function"==typeof n[o.cbIdx]?Zone.current.scheduleMicroTask(o.name,n[o.cbIdx],o,i):e.apply(t,n)}}))}(process,"nextTick",(function(e,t){return{name:"process.nextTick",args:t,cbIdx:t.length>0&&"function"==typeof t[0]?0:-1,target:process}}))})),Zone.__load_patch("handleUnhandledPromiseRejection",(function(e,t,n){function r(e){return function(t){I(process,e).forEach((function(n){"unhandledRejection"===e?n.invoke(t.rejection,t.promise):"rejectionHandled"===e&&n.invoke(t.promise)}))}}t[n.symbol("unhandledPromiseRejectionHandler")]=r("unhandledRejection"),t[n.symbol("rejectionHandledHandler")]=r("rejectionHandled")})),Zone.__load_patch("crypto",(function(){var e;try{e=require("crypto")}catch(e){}e&&["randomBytes","pbkdf2"].forEach((function(t){w(e,t,(function(n,r){return{name:"crypto."+t,args:r,cbIdx:r.length>0&&"function"==typeof r[r.length-1]?r.length-1:-1,target:e}}))}))})),Zone.__load_patch("console",(function(e,t){["dir","log","info","error","warn","assert","debug","timeEnd","trace"].forEach((function(e){var n=console[t.__symbol__(e)]=console[e];n&&(console[e]=function(){var e=r.call(arguments);return t.current===t.root?n.apply(this,e):t.root.run(n,this,e)})}))}))}));