Files
RaymondVerhoef 14286d6cb1 Add TypeScript type definitions for app components and layout
- Created type definitions for `auth`, `layout`, and `page` components to ensure type safety and consistency.
- Implemented checks for entry validity and prop types using utility types.
- Added a `package.json` file to specify module type for TypeScript compatibility.
2026-05-23 22:10:58 +02:00

25 lines
94 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "vendor-chunks/pocketbase";
exports.ids = ["vendor-chunks/pocketbase"];
exports.modules = {
/***/ "(ssr)/./node_modules/pocketbase/dist/pocketbase.es.mjs":
/*!********************************************************!*\
!*** ./node_modules/pocketbase/dist/pocketbase.es.mjs ***!
\********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AdminService: () => (/* binding */ AdminService),\n/* harmony export */ AsyncAuthStore: () => (/* binding */ AsyncAuthStore),\n/* harmony export */ BaseAuthStore: () => (/* binding */ BaseAuthStore),\n/* harmony export */ ClientResponseError: () => (/* binding */ ClientResponseError),\n/* harmony export */ CollectionService: () => (/* binding */ CollectionService),\n/* harmony export */ CrudService: () => (/* binding */ CrudService),\n/* harmony export */ HealthService: () => (/* binding */ HealthService),\n/* harmony export */ LocalAuthStore: () => (/* binding */ LocalAuthStore),\n/* harmony export */ LogService: () => (/* binding */ LogService),\n/* harmony export */ RealtimeService: () => (/* binding */ RealtimeService),\n/* harmony export */ RecordService: () => (/* binding */ RecordService),\n/* harmony export */ cookieParse: () => (/* binding */ cookieParse),\n/* harmony export */ cookieSerialize: () => (/* binding */ cookieSerialize),\n/* harmony export */ \"default\": () => (/* binding */ Client),\n/* harmony export */ getTokenPayload: () => (/* binding */ getTokenPayload),\n/* harmony export */ isTokenExpired: () => (/* binding */ isTokenExpired),\n/* harmony export */ normalizeUnknownQueryParams: () => (/* binding */ normalizeUnknownQueryParams)\n/* harmony export */ });\nclass ClientResponseError extends Error{constructor(e){super(\"ClientResponseError\"),this.url=\"\",this.status=0,this.response={},this.isAbort=!1,this.originalError=null,Object.setPrototypeOf(this,ClientResponseError.prototype),null!==e&&\"object\"==typeof e&&(this.url=\"string\"==typeof e.url?e.url:\"\",this.status=\"number\"==typeof e.status?e.status:0,this.isAbort=!!e.isAbort,this.originalError=e.originalError,null!==e.response&&\"object\"==typeof e.response?this.response=e.response:null!==e.data&&\"object\"==typeof e.data?this.response=e.data:this.response={}),this.originalError||e instanceof ClientResponseError||(this.originalError=e),\"undefined\"!=typeof DOMException&&e instanceof DOMException&&(this.isAbort=!0),this.name=\"ClientResponseError \"+this.status,this.message=this.response?.message,this.message||(this.isAbort?this.message=\"The request was autocancelled. You can find more info in https://github.com/pocketbase/js-sdk#auto-cancellation.\":this.originalError?.cause?.message?.includes(\"ECONNREFUSED ::1\")?this.message=\"Failed to connect to the PocketBase server. Try changing the SDK URL from localhost to 127.0.0.1 (https://github.com/pocketbase/js-sdk/issues/21).\":this.message=\"Something went wrong while processing your request.\")}get data(){return this.response}toJSON(){return{...this}}}const e=/^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;function cookieParse(e,t){const s={};if(\"string\"!=typeof e)return s;const i=Object.assign({},t||{}).decode||defaultDecode;let n=0;for(;n<e.length;){const t=e.indexOf(\"=\",n);if(-1===t)break;let r=e.indexOf(\";\",n);if(-1===r)r=e.length;else if(r<t){n=e.lastIndexOf(\";\",t-1)+1;continue}const o=e.slice(n,t).trim();if(void 0===s[o]){let n=e.slice(t+1,r).trim();34===n.charCodeAt(0)&&(n=n.slice(1,-1));try{s[o]=i(n)}catch(e){s[o]=n}}n=r+1}return s}function cookieSerialize(t,s,i){const n=Object.assign({},i||{}),r=n.encode||defaultEncode;if(!e.test(t))throw new TypeError(\"argument name is invalid\");const o=r(s);if(o&&!e.test(o))throw new TypeError(\"argument val is invalid\");let a=t+\"=\"+o;if(null!=n.maxAge){const e=n.maxAge-0;if(isNaN(e)||!isFinite(e))throw new TypeError(\"option maxAge is invalid\");a+=\"; Max-Age=\"+Math.floor(e)}if(n.domain){if(!e.test(n.domain))throw new TypeError(\"option domain is invalid\");a+=\"; Domain=\"+n.domain}if(n.path){if(!e.test(n.path))throw new TypeError(\"option path is invalid\");a+=\"; Path=\"+n.path}if(n.expires){if(!function isDate(e){return\"[object Date]\"===Object.prototype.toString.call(e)||e instanceof Date}(n.expires)||isNaN(n.expires.valueOf()))throw new TypeError(\"option expires is invalid\");a+=\"; Expires=\"+n.expires.toUTCString()}if(n.httpOnly&&(a+=\"; HttpOnly\"),n.secure&&(a+=\"; Secure\"),n.priority){switch(\"string\"==typeof n.priority?n.priority.toLowerCase():n.priority){case\"low\":a+=\"; Priority=Low\";break;case\"medium\":a+=\"; Priority=Medium\";break;case\"high\":a+=\"; Priority=High\";break;default:throw new TypeError(\"option priority is invalid\")}}if(n.sameSite){switch(\"string\"==typeof n.sameSite?n.sameSite.toLowerCase():n.sameSite){case!0:a+=\"; SameSite=Strict\";break;case\"lax\":a+=\"; SameSite=Lax\";break;case\"strict\":a+=\"; SameSite=Strict\";break;case\"none\":a+=\"; SameSite=None\";break;default:throw new TypeError(\"option sameSite is invalid\")}}return a}function defaultDecode(e){return-1!==e.indexOf(\"%\")?decodeURIComponent(e):e}function defaultEncode(e){return encodeURIComponent(e)}const t=\"undefined\"!=typeof navigator&&\"ReactNative\"===navigator.product||\"undefined\"!=typeof global&&global.HermesInternal;let s;function getTokenPayload(e){if(e)try{const t=decodeURIComponent(s(e.split(\".\")[1]).split(\"\").map((function(e){return\"%\"+(\"00\"+e.charCodeAt(0).toString(16)).slice(-2)})).join(\"\"));return JSON.parse(t)||{}}catch(e){}return{}}function isTokenExpired(e,t=0){let s=getTokenPayload(e);return!(Object.keys(s).length>0&&(!s.exp||s.exp-t>Date.now()/1e3))}s=\"function\"!=typeof atob||t?e=>{let t=String(e).replace(/=+$/,\"\");if(t.length%4==1)throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var s,i,n=0,r=0,o=\"\";i=t.charAt(r++);~i&&(s=n%4?64*s+i:i,n++%4)?o+=String.fromCharCode(255&s>>(-2*n&6)):0)i=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(i);return o}:atob;const i=\"pb_auth\";class BaseAuthStore{constructor(){this.baseToken=\"\",this.baseModel=null,this._onChangeCallbacks=[]}get token(){return this.baseToken}get model(){return this.baseModel}get isValid(){return!isTokenExpired(this.token)}get isAdmin(){return\"admin\"===getTokenPayload(this.token).type}get isAuthRecord(){return\"authRecord\"===getTokenPayload(this.token).type}save(e,t){this.baseToken=e||\"\",this.baseModel=t||null,this.triggerChange()}clear(){this.baseToken=\"\",this.baseModel=null,this.triggerChange()}loadFromCookie(e,t=i){const s=cookieParse(e||\"\")[t]||\"\";let n={};try{n=JSON.parse(s),(null===typeof n||\"object\"!=typeof n||Array.isArray(n))&&(n={})}catch(e){}this.save(n.token||\"\",n.model||null)}exportToCookie(e,t=i){const s={secure:!0,sameSite:!0,httpOnly:!0,path:\"/\"},n=getTokenPayload(this.token);s.expires=n?.exp?new Date(1e3*n.exp):new Date(\"1970-01-01\"),e=Object.assign({},s,e);const r={token:this.token,model:this.model?JSON.parse(JSON.stringify(this.model)):null};let o=cookieSerialize(t,JSON.stringify(r),e);const a=\"undefined\"!=typeof Blob?new Blob([o]).size:o.length;if(r.model&&a>4096){r.model={id:r?.model?.id,email:r?.model?.email};const s=[\"collectionId\",\"username\",\"verified\"];for(const e in this.model)s.includes(e)&&(r.model[e]=this.model[e]);o=cookieSerialize(t,JSON.stringify(r),e)}return o}onChange(e,t=!1){return this._onChangeCallbacks.push(e),t&&e(this.token,this.model),()=>{for(let t=this._onChangeCallbacks.length-1;t>=0;t--)if(this._onChangeCallbacks[t]==e)return delete this._onChangeCallbacks[t],void this._onChangeCallbacks.splice(t,1)}}triggerChange(){for(const e of this._onChangeCallbacks)e&&e(this.token,this.model)}}class LocalAuthStore extends BaseAuthStore{constructor(e=\"pocketbase_auth\"){super(),this.storageFallback={},this.storageKey=e,this._bindStorageEvent()}get token(){return(this._storageGet(this.storageKey)||{}).token||\"\"}get model(){return(this._storageGet(this.storageKey)||{}).model||null}save(e,t){this._storageSet(this.storageKey,{token:e,model:t}),super.save(e,t)}clear(){this._storageRemove(this.storageKey),super.clear()}_storageGet(e){if(\"undefined\"!=typeof window&&window?.localStorage){const t=window.localStorage.getItem(e)||\"\";try{return JSON.parse(t)}catch(e){return t}}return this.storageFallback[e]}_storageSet(e,t){if(\"undefined\"!=typeof window&&window?.localStorage){let s=t;\"string\"!=typeof t&&(s=JSON.stringify(t)),window.localStorage.setItem(e,s)}else this.storageFallback[e]=t}_storageRemove(e){\"undefined\"!=typeof window&&window?.localStorage&&window.localStorage?.removeItem(e),delete this.storageFallback[e]}_bindStorageEvent(){\"undefined\"!=typeof window&&window?.localStorage&&window.addEventListener&&window.addEventListener(\"storage\",(e=>{if(e.key!=this.storageKey)return;const t=this._storageGet(this.storageKey)||{};super.save(t.token||\"\",t.model||null)}))}}class BaseService{constructor(e){this.client=e}}class SettingsService extends BaseService{async getAll(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/settings\",e)}async update(e,t){return t=Object.assign({method:\"PATCH\",body:e},t),this.client.send(\"/api/settings\",t)}async testS3(e=\"storage\",t){return t=Object.assign({method:\"POST\",body:{filesystem:e}},t),this.client.send(\"/api/settings/test/s3\",t).then((()=>!0))}async testEmail(e,t,s){return s=Object.assign({method:\"POST\",body:{email:e,template:t}},s),this.client.send(\"/api/settings/test/email\",s).then((()=>!0))}async generateAppleClientSecret(e,t,s,i,n,r){return r=Object.assign({method:\"POST\",body:{clientId:e,teamId:t,keyId:s,privateKey:i,duration:n}},r),this.client.send(\"/api/settings/apple/generate-client-secret\",r)}}class CrudService extends BaseService{decode(e){return e}async getFullList(e,t){if(\"number\"==typeof e)return this._getFullList(e,t);let s=500;return(t=Object.assign({},e,t)).batch&&(s=t.batch,delete t.batch),this._getFullList(s,t)}async getList(e=1,t=30,s){return(s=Object.assign({method:\"GET\"},s)).query=Object.assign({page:e,perPage:t},s.query),this.client.send(this.baseCrudPath,s).then((e=>(e.items=e.items?.map((e=>this.decode(e)))||[],e)))}async getFirstListItem(e,t){return(t=Object.assign({requestKey:\"one_by_filter_\"+this.baseCrudPath+\"_\"+e},t)).query=Object.assign({filter:e,skipTotal:1},t.query),this.getList(1,1,t).then((e=>{if(!e?.items?.length)throw new ClientResponseError({status:404,response:{code:404,message:\"The requested resource wasn't found.\",data:{}}});return e.items[0]}))}async getOne(e,t){if(!e)throw new ClientResponseError({url:this.client.buildUrl(this.baseCrudPath+\"/\"),status:404,response:{code:404,message:\"Missing required record id.\",data:{}}});return t=Object.assign({method:\"GET\"},t),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e),t).then((e=>this.decode(e)))}async create(e,t){return t=Object.assign({method:\"POST\",body:e},t),this.client.send(this.baseCrudPath,t).then((e=>this.decode(e)))}async update(e,t,s){return s=Object.assign({method:\"PATCH\",body:t},s),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e),s).then((e=>this.decode(e)))}async delete(e,t){return t=Object.assign({method:\"DELETE\"},t),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e),t).then((()=>!0))}_getFullList(e=500,t){(t=t||{}).query=Object.assign({skipTotal:1},t.query);let s=[],request=async i=>this.getList(i,e||500,t).then((e=>{const t=e.items;return s=s.concat(t),t.length==e.perPage?request(i+1):s}));return request(1)}}function normalizeLegacyOptionsArgs(e,t,s,i){const n=void 0!==i;return n||void 0!==s?n?(console.warn(e),t.body=Object.assign({},t.body,s),t.query=Object.assign({},t.query,i),t):Object.assign(t,s):t}function resetAutoRefresh(e){e._resetAutoRefresh?.()}class AdminService extends CrudService{get baseCrudPath(){return\"/api/admins\"}async update(e,t,s){return super.update(e,t,s).then((e=>(this.client.authStore.model?.id===e.id&&void 0===this.client.authStore.model?.collectionId&&this.client.authStore.save(this.client.authStore.token,e),e)))}async delete(e,t){return super.delete(e,t).then((t=>(t&&this.client.authStore.model?.id===e&&void 0===this.client.authStore.model?.collectionId&&this.client.authStore.clear(),t)))}authResponse(e){const t=this.decode(e?.admin||{});return e?.token&&e?.admin&&this.client.authStore.save(e.token,t),Object.assign({},e,{token:e?.token||\"\",admin:t})}async authWithPassword(e,t,s,i){let n={method:\"POST\",body:{identity:e,password:t}};n=normalizeLegacyOptionsArgs(\"This form of authWithPassword(email, pass, body?, query?) is deprecated. Consider replacing it with authWithPassword(email, pass, options?).\",n,s,i);const r=n.autoRefreshThreshold;delete n.autoRefreshThreshold,n.autoRefresh||resetAutoRefresh(this.client);let o=await this.client.send(this.baseCrudPath+\"/auth-with-password\",n);return o=this.authResponse(o),r&&function registerAutoRefresh(e,t,s,i){resetAutoRefresh(e);const n=e.beforeSend,r=e.authStore.model,o=e.authStore.onChange(((t,s)=>{(!t||s?.id!=r?.id||(s?.collectionId||r?.collectionId)&&s?.collectionId!=r?.collectionId)&&resetAutoRefresh(e)}));e._resetAutoRefresh=function(){o(),e.beforeSend=n,delete e._resetAutoRefresh},e.beforeSend=async(r,o)=>{const a=e.authStore.token;if(o.query?.autoRefresh)return n?n(r,o):{url:r,sendOptions:o};let c=e.authStore.isValid;if(c&&isTokenExpired(e.authStore.token,t))try{await s()}catch(e){c=!1}c||await i();const l=o.headers||{};for(let t in l)if(\"authorization\"==t.toLowerCase()&&a==l[t]&&e.authStore.token){l[t]=e.authStore.token;break}return o.headers=l,n?n(r,o):{url:r,sendOptions:o}}}(this.client,r,(()=>this.authRefresh({autoRefresh:!0})),(()=>this.authWithPassword(e,t,Object.assign({autoRefresh:!0},n)))),o}async authRefresh(e,t){let s={method:\"POST\"};return s=normalizeLegacyOptionsArgs(\"This form of authRefresh(body?, query?) is deprecated. Consider replacing it with authRefresh(options?).\",s,e,t),this.client.send(this.baseCrudPath+\"/auth-refresh\",s).then(this.authResponse.bind(this))}async requestPasswordReset(e,t,s){let i={method:\"POST\",body:{email:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestPasswordReset(email, body?, query?) is deprecated. Consider replacing it with requestPasswordReset(email, options?).\",i,t,s),this.client.send(this.baseCrudPath+\"/request-password-reset\",i).then((()=>!0))}async confirmPasswordReset(e,t,s,i,n){let r={method:\"POST\",body:{token:e,password:t,passwordConfirm:s}};return r=normalizeLegacyOptionsArgs(\"This form of confirmPasswordReset(resetToken, password, passwordConfirm, body?, query?) is deprecated. Consider replacing it with confirmPasswordReset(resetToken, password, passwordConfirm, options?).\",r,i,n),this.client.send(this.baseCrudPath+\"/confirm-password-reset\",r).then((()=>!0))}}const n=[\"requestKey\",\"$cancelKey\",\"$autoCancel\",\"fetch\",\"headers\",\"body\",\"query\",\"params\",\"cache\",\"credentials\",\"headers\",\"integrity\",\"keepalive\",\"method\",\"mode\",\"redirect\",\"referrer\",\"referrerPolicy\",\"signal\",\"window\"];function normalizeUnknownQueryParams(e){if(e){e.query=e.query||{};for(let t in e)n.includes(t)||(e.query[t]=e[t],delete e[t])}}class RealtimeService extends BaseService{constructor(){super(...arguments),this.clientId=\"\",this.eventSource=null,this.subscriptions={},this.lastSentSubscriptions=[],this.maxConnectTimeout=15e3,this.reconnectAttempts=0,this.maxReconnectAttempts=1/0,this.predefinedReconnectIntervals=[200,300,500,1e3,1200,1500,2e3],this.pendingConnects=[]}get isConnected(){return!!this.eventSource&&!!this.clientId&&!this.pendingConnects.length}async subscribe(e,t,s){if(!e)throw new Error(\"topic must be set.\");let i=e;if(s){normalizeUnknownQueryParams(s=Object.assign({},s));const e=\"options=\"+encodeURIComponent(JSON.stringify({query:s.query,headers:s.headers}));i+=(i.includes(\"?\")?\"&\":\"?\")+e}const listener=function(e){const s=e;let i;try{i=JSON.parse(s?.data)}catch{}t(i||{})};return this.subscriptions[i]||(this.subscriptions[i]=[]),this.subscriptions[i].push(listener),this.isConnected?1===this.subscriptions[i].length?await this.submitSubscriptions():this.eventSource?.addEventListener(i,listener):await this.connect(),async()=>this.unsubscribeByTopicAndListener(e,listener)}async unsubscribe(e){let t=!1;if(e){const s=this.getSubscriptionsByTopic(e);for(let e in s)if(this.hasSubscriptionListeners(e)){for(let t of this.subscriptions[e])this.eventSource?.removeEventListener(e,t);delete this.subscriptions[e],t||(t=!0)}}else this.subscriptions={};this.hasSubscriptionListeners()?t&&await this.submitSubscriptions():this.disconnect()}async unsubscribeByPrefix(e){let t=!1;for(let s in this.subscriptions)if((s+\"?\").startsWith(e)){t=!0;for(let e of this.subscriptions[s])this.eventSource?.removeEventListener(s,e);delete this.subscriptions[s]}t&&(this.hasSubscriptionListeners()?await this.submitSubscriptions():this.disconnect())}async unsubscribeByTopicAndListener(e,t){let s=!1;const i=this.getSubscriptionsByTopic(e);for(let e in i){if(!Array.isArray(this.subscriptions[e])||!this.subscriptions[e].length)continue;let i=!1;for(let s=this.subscriptions[e].length-1;s>=0;s--)this.subscriptions[e][s]===t&&(i=!0,delete this.subscriptions[e][s],this.subscriptions[e].splice(s,1),this.eventSource?.removeEventListener(e,t));i&&(this.subscriptions[e].length||delete this.subscriptions[e],s||this.hasSubscriptionListeners(e)||(s=!0))}this.hasSubscriptionListeners()?s&&await this.submitSubscriptions():this.disconnect()}hasSubscriptionListeners(e){if(this.subscriptions=this.subscriptions||{},e)return!!this.subscriptions[e]?.length;for(let e in this.subscriptions)if(this.subscriptions[e]?.length)return!0;return!1}async submitSubscriptions(){if(this.clientId)return this.addAllSubscriptionListeners(),this.lastSentSubscriptions=this.getNonEmptySubscriptionKeys(),this.client.send(\"/api/realtime\",{method:\"POST\",body:{clientId:this.clientId,subscriptions:this.lastSentSubscriptions},requestKey:this.getSubscriptionsCancelKey()}).catch((e=>{if(!e?.isAbort)throw e}))}getSubscriptionsCancelKey(){return\"realtime_\"+this.clientId}getSubscriptionsByTopic(e){const t={};e=e.includes(\"?\")?e:e+\"?\";for(let s in this.subscriptions)(s+\"?\").startsWith(e)&&(t[s]=this.subscriptions[s]);return t}getNonEmptySubscriptionKeys(){const e=[];for(let t in this.subscriptions)this.subscriptions[t].length&&e.push(t);return e}addAllSubscriptionListeners(){if(this.eventSource){this.removeAllSubscriptionListeners();for(let e in this.subscriptions)for(let t of this.subscriptions[e])this.eventSource.addEventListener(e,t)}}removeAllSubscriptionListeners(){if(this.eventSource)for(let e in this.subscriptions)for(let t of this.subscriptions[e])this.eventSource.removeEventListener(e,t)}async connect(){if(!(this.reconnectAttempts>0))return new Promise(((e,t)=>{this.pendingConnects.push({resolve:e,reject:t}),this.pendingConnects.length>1||this.initConnect()}))}initConnect(){this.disconnect(!0),clearTimeout(this.connectTimeoutId),this.connectTimeoutId=setTimeout((()=>{this.connectErrorHandler(new Error(\"EventSource connect took too long.\"))}),this.maxConnectTimeout),this.eventSource=new EventSource(this.client.buildUrl(\"/api/realtime\")),this.eventSource.onerror=e=>{this.connectErrorHandler(new Error(\"Failed to establish realtime connection.\"))},this.eventSource.addEventListener(\"PB_CONNECT\",(e=>{const t=e;this.clientId=t?.lastEventId,this.submitSubscriptions().then((async()=>{let e=3;for(;this.hasUnsentSubscriptions()&&e>0;)e--,await this.submitSubscriptions()})).then((()=>{for(let e of this.pendingConnects)e.resolve();this.pendingConnects=[],this.reconnectAttempts=0,clearTimeout(this.reconnectTimeoutId),clearTimeout(this.connectTimeoutId);const t=this.getSubscriptionsByTopic(\"PB_CONNECT\");for(let s in t)for(let i of t[s])i(e)})).catch((e=>{this.clientId=\"\",this.connectErrorHandler(e)}))}))}hasUnsentSubscriptions(){const e=this.getNonEmptySubscriptionKeys();if(e.length!=this.lastSentSubscriptions.length)return!0;for(const t of e)if(!this.lastSentSubscriptions.includes(t))return!0;return!1}connectErrorHandler(e){if(clearTimeout(this.connectTimeoutId),clearTimeout(this.reconnectTimeoutId),!this.clientId&&!this.reconnectAttempts||this.reconnectAttempts>this.maxReconnectAttempts){for(let t of this.pendingConnects)t.reject(new ClientResponseError(e));return this.pendingConnects=[],void this.disconnect()}this.disconnect(!0);const t=this.predefinedReconnectIntervals[this.reconnectAttempts]||this.predefinedReconnectIntervals[this.predefinedReconnectIntervals.length-1];this.reconnectAttempts++,this.reconnectTimeoutId=setTimeout((()=>{this.initConnect()}),t)}disconnect(e=!1){if(clearTimeout(this.connectTimeoutId),clearTimeout(this.reconnectTimeoutId),this.removeAllSubscriptionListeners(),this.client.cancelRequest(this.getSubscriptionsCancelKey()),this.eventSource?.close(),this.eventSource=null,this.clientId=\"\",!e){this.reconnectAttempts=0;for(let e of this.pendingConnects)e.resolve();this.pendingConnects=[]}}}class RecordService extends CrudService{constructor(e,t){super(e),this.collectionIdOrName=t}get baseCrudPath(){return this.baseCollectionPath+\"/records\"}get baseCollectionPath(){return\"/api/collections/\"+encodeURIComponent(this.collectionIdOrName)}async subscribe(e,t,s){if(!e)throw new Error(\"Missing topic.\");if(!t)throw new Error(\"Missing subscription callback.\");return this.client.realtime.subscribe(this.collectionIdOrName+\"/\"+e,t,s)}async unsubscribe(e){return e?this.client.realtime.unsubscribe(this.collectionIdOrName+\"/\"+e):this.client.realtime.unsubscribeByPrefix(this.collectionIdOrName)}async getFullList(e,t){if(\"number\"==typeof e)return super.getFullList(e,t);const s=Object.assign({},e,t);return super.getFullList(s)}async getList(e=1,t=30,s){return super.getList(e,t,s)}async getFirstListItem(e,t){return super.getFirstListItem(e,t)}async getOne(e,t){return super.getOne(e,t)}async create(e,t){return super.create(e,t)}async update(e,t,s){return super.update(e,t,s).then((e=>(this.client.authStore.model?.id!==e?.id||this.client.authStore.model?.collectionId!==this.collectionIdOrName&&this.client.authStore.model?.collectionName!==this.collectionIdOrName||this.client.authStore.save(this.client.authStore.token,e),e)))}async delete(e,t){return super.delete(e,t).then((t=>(!t||this.client.authStore.model?.id!==e||this.client.authStore.model?.collectionId!==this.collectionIdOrName&&this.client.authStore.model?.collectionName!==this.collectionIdOrName||this.client.authStore.clear(),t)))}authResponse(e){const t=this.decode(e?.record||{});return this.client.authStore.save(e?.token,t),Object.assign({},e,{token:e?.token||\"\",record:t})}async listAuthMethods(e){return e=Object.assign({method:\"GET\"},e),this.client.send(this.baseCollectionPath+\"/auth-methods\",e).then((e=>Object.assign({},e,{usernamePassword:!!e?.usernamePassword,emailPassword:!!e?.emailPassword,authProviders:Array.isArray(e?.authProviders)?e?.authProviders:[]})))}async authWithPassword(e,t,s,i){let n={method:\"POST\",body:{identity:e,password:t}};return n=normalizeLegacyOptionsArgs(\"This form of authWithPassword(usernameOrEmail, pass, body?, query?) is deprecated. Consider replacing it with authWithPassword(usernameOrEmail, pass, options?).\",n,s,i),this.client.send(this.baseCollectionPath+\"/auth-with-password\",n).then((e=>this.authResponse(e)))}async authWithOAuth2Code(e,t,s,i,n,r,o){let a={method:\"POST\",body:{provider:e,code:t,codeVerifier:s,redirectUrl:i,createData:n}};return a=normalizeLegacyOptionsArgs(\"This form of authWithOAuth2Code(provider, code, codeVerifier, redirectUrl, createData?, body?, query?) is deprecated. Consider replacing it with authWithOAuth2Code(provider, code, codeVerifier, redirectUrl, createData?, options?).\",a,r,o),this.client.send(this.baseCollectionPath+\"/auth-with-oauth2\",a).then((e=>this.authResponse(e)))}authWithOAuth2(...e){if(e.length>1||\"string\"==typeof e?.[0])return console.warn(\"PocketBase: This form of authWithOAuth2() is deprecated and may get removed in the future. Please replace with authWithOAuth2Code() OR use the authWithOAuth2() realtime form as shown in https://pocketbase.io/docs/authentication/#oauth2-integration.\"),this.authWithOAuth2Code(e?.[0]||\"\",e?.[1]||\"\",e?.[2]||\"\",e?.[3]||\"\",e?.[4]||{},e?.[5]||{},e?.[6]||{});const t=e?.[0]||{};let s=null;t.urlCallback||(s=openBrowserPopup(void 0));const i=new RealtimeService(this.client);function cleanup(){s?.close(),i.unsubscribe()}const n={},r=t.requestKey;return r&&(n.requestKey=r),this.listAuthMethods(n).then((e=>{const n=e.authProviders.find((e=>e.name===t.provider));if(!n)throw new ClientResponseError(new Error(`Missing or invalid provider \"${t.provider}\".`));const o=this.client.buildUrl(\"/api/oauth2-redirect\"),a=r?this.client.cancelControllers?.[r]:void 0;return a&&(a.signal.onabort=()=>{cleanup()}),new Promise((async(e,r)=>{try{await i.subscribe(\"@oauth2\",(async s=>{const c=i.clientId;try{if(!s.state||c!==s.state)throw new Error(\"State parameters don't match.\");if(s.error||!s.code)throw new Error(\"OAuth2 redirect error or missing code: \"+s.error);const i=Object.assign({},t);delete i.provider,delete i.scopes,delete i.createData,delete i.urlCallback,a?.signal?.onabort&&(a.signal.onabort=null);const r=await this.authWithOAuth2Code(n.name,s.code,n.codeVerifier,o,t.createData,i);e(r)}catch(e){r(new ClientResponseError(e))}cleanup()}));const c={state:i.clientId};t.scopes?.length&&(c.scope=t.scopes.join(\" \"));const l=this._replaceQueryParams(n.authUrl+o,c);let h=t.urlCallback||function(e){s?s.location.href=e:s=openBrowserPopup(e)};await h(l)}catch(e){cleanup(),r(new ClientResponseError(e))}}))})).catch((e=>{throw cleanup(),e}))}async authRefresh(e,t){let s={method:\"POST\"};return s=normalizeLegacyOptionsArgs(\"This form of authRefresh(body?, query?) is deprecated. Consider replacing it with authRefresh(options?).\",s,e,t),this.client.send(this.baseCollectionPath+\"/auth-refresh\",s).then((e=>this.authResponse(e)))}async requestPasswordReset(e,t,s){let i={method:\"POST\",body:{email:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestPasswordReset(email, body?, query?) is deprecated. Consider replacing it with requestPasswordReset(email, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/request-password-reset\",i).then((()=>!0))}async confirmPasswordReset(e,t,s,i,n){let r={method:\"POST\",body:{token:e,password:t,passwordConfirm:s}};return r=normalizeLegacyOptionsArgs(\"This form of confirmPasswordReset(token, password, passwordConfirm, body?, query?) is deprecated. Consider replacing it with confirmPasswordReset(token, password, passwordConfirm, options?).\",r,i,n),this.client.send(this.baseCollectionPath+\"/confirm-password-reset\",r).then((()=>!0))}async requestVerification(e,t,s){let i={method:\"POST\",body:{email:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestVerification(email, body?, query?) is deprecated. Consider replacing it with requestVerification(email, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/request-verification\",i).then((()=>!0))}async confirmVerification(e,t,s){let i={method:\"POST\",body:{token:e}};return i=normalizeLegacyOptionsArgs(\"This form of confirmVerification(token, body?, query?) is deprecated. Consider replacing it with confirmVerification(token, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/confirm-verification\",i).then((()=>{const t=getTokenPayload(e),s=this.client.authStore.model;return s&&!s.verified&&s.id===t.id&&s.collectionId===t.collectionId&&(s.verified=!0,this.client.authStore.save(this.client.authStore.token,s)),!0}))}async requestEmailChange(e,t,s){let i={method:\"POST\",body:{newEmail:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestEmailChange(newEmail, body?, query?) is deprecated. Consider replacing it with requestEmailChange(newEmail, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/request-email-change\",i).then((()=>!0))}async confirmEmailChange(e,t,s,i){let n={method:\"POST\",body:{token:e,password:t}};return n=normalizeLegacyOptionsArgs(\"This form of confirmEmailChange(token, password, body?, query?) is deprecated. Consider replacing it with confirmEmailChange(token, password, options?).\",n,s,i),this.client.send(this.baseCollectionPath+\"/confirm-email-change\",n).then((()=>{const t=getTokenPayload(e),s=this.client.authStore.model;return s&&s.id===t.id&&s.collectionId===t.collectionId&&this.client.authStore.clear(),!0}))}async listExternalAuths(e,t){return t=Object.assign({method:\"GET\"},t),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e)+\"/external-auths\",t)}async unlinkExternalAuth(e,t,s){return s=Object.assign({method:\"DELETE\"},s),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e)+\"/external-auths/\"+encodeURIComponent(t),s).then((()=>!0))}_replaceQueryParams(e,t={}){let s=e,i=\"\";e.indexOf(\"?\")>=0&&(s=e.substring(0,e.indexOf(\"?\")),i=e.substring(e.indexOf(\"?\")+1));const n={},r=i.split(\"&\");for(const e of r){if(\"\"==e)continue;const t=e.split(\"=\");n[decodeURIComponent(t[0].replace(/\\+/g,\" \"))]=decodeURIComponent((t[1]||\"\").replace(/\\+/g,\" \"))}for(let e in t)t.hasOwnProperty(e)&&(null==t[e]?delete n[e]:n[e]=t[e]);i=\"\";for(let e in n)n.hasOwnProperty(e)&&(\"\"!=i&&(i+=\"&\"),i+=encodeURIComponent(e.replace(/%20/g,\"+\"))+\"=\"+encodeURIComponent(n[e].replace(/%20/g,\"+\")));return\"\"!=i?s+\"?\"+i:s}}function openBrowserPopup(e){if(\"undefined\"==typeof window||!window?.open)throw new ClientResponseError(new Error(\"Not in a browser context - please pass a custom urlCallback function.\"));let t=1024,s=768,i=window.innerWidth,n=window.innerHeight;t=t>i?i:t,s=s>n?n:s;let r=i/2-t/2,o=n/2-s/2;return window.open(e,\"popup_window\",\"width=\"+t+\",height=\"+s+\",top=\"+o+\",left=\"+r+\",resizable,menubar=no\")}class CollectionService extends CrudService{get baseCrudPath(){return\"/api/collections\"}async import(e,t=!1,s){return s=Object.assign({method:\"PUT\",body:{collections:e,deleteMissing:t}},s),this.client.send(this.baseCrudPath+\"/import\",s).then((()=>!0))}}class LogService extends BaseService{async getList(e=1,t=30,s){return(s=Object.assign({method:\"GET\"},s)).query=Object.assign({page:e,perPage:t},s.query),this.client.send(\"/api/logs\",s)}async getOne(e,t){if(!e)throw new ClientResponseError({url:this.client.buildUrl(\"/api/logs/\"),status:404,response:{code:404,message:\"Missing required log id.\",data:{}}});return t=Object.assign({method:\"GET\"},t),this.client.send(\"/api/logs/\"+encodeURIComponent(e),t)}async getStats(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/logs/stats\",e)}}class HealthService extends BaseService{async check(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/health\",e)}}class FileService extends BaseService{getUrl(e,t,s={}){if(!t||!e?.id||!e?.collectionId&&!e?.collectionName)return\"\";const i=[];i.push(\"api\"),i.push(\"files\"),i.push(encodeURIComponent(e.collectionId||e.collectionName)),i.push(encodeURIComponent(e.id)),i.push(encodeURIComponent(t));let n=this.client.buildUrl(i.join(\"/\"));if(Object.keys(s).length){!1===s.download&&delete s.download;const e=new URLSearchParams(s);n+=(n.includes(\"?\")?\"&\":\"?\")+e}return n}async getToken(e){return e=Object.assign({method:\"POST\"},e),this.client.send(\"/api/files/token\",e).then((e=>e?.token||\"\"))}}class BackupService extends BaseService{async getFullList(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/backups\",e)}async create(e,t){return t=Object.assign({method:\"POST\",body:{name:e}},t),this.client.send(\"/api/backups\",t).then((()=>!0))}async upload(e,t){return t=Object.assign({method:\"POST\",body:e},t),this.client.send(\"/api/backups/upload\",t).then((()=>!0))}async delete(e,t){return t=Object.assign({method:\"DELETE\"},t),this.client.send(`/api/backups/${encodeURIComponent(e)}`,t).then((()=>!0))}async restore(e,t){return t=Object.assign({method:\"POST\"},t),this.client.send(`/api/backups/${encodeURIComponent(e)}/restore`,t).then((()=>!0))}getDownloadUrl(e,t){return this.client.buildUrl(`/api/backups/${encodeURIComponent(t)}?token=${encodeURIComponent(e)}`)}}class Client{constructor(e=\"/\",t,s=\"en-US\"){this.cancelControllers={},this.recordServices={},this.enableAutoCancellation=!0,this.baseUrl=e,this.lang=s,this.authStore=t||new LocalAuthStore,this.admins=new AdminService(this),this.collections=new CollectionService(this),this.files=new FileService(this),this.logs=new LogService(this),this.settings=new SettingsService(this),this.realtime=new RealtimeService(this),this.health=new HealthService(this),this.backups=new BackupService(this)}collection(e){return this.recordServices[e]||(this.recordServices[e]=new RecordService(this,e)),this.recordServices[e]}autoCancellation(e){return this.enableAutoCancellation=!!e,this}cancelRequest(e){return this.cancelControllers[e]&&(this.cancelControllers[e].abort(),delete this.cancelControllers[e]),this}cancelAllRequests(){for(let e in this.cancelControllers)this.cancelControllers[e].abort();return this.cancelControllers={},this}filter(e,t){if(!t)return e;for(let s in t){let i=t[s];switch(typeof i){case\"boolean\":case\"number\":i=\"\"+i;break;case\"string\":i=\"'\"+i.replace(/'/g,\"\\\\'\")+\"'\";break;default:i=null===i?\"null\":i instanceof Date?\"'\"+i.toISOString().replace(\"T\",\" \")+\"'\":\"'\"+JSON.stringify(i).replace(/'/g,\"\\\\'\")+\"'\"}e=e.replaceAll(\"{:\"+s+\"}\",i)}return e}getFileUrl(e,t,s={}){return this.files.getUrl(e,t,s)}buildUrl(e){let t=this.baseUrl;return\"undefined\"==typeof window||!window.location||t.startsWith(\"https://\")||t.startsWith(\"http://\")||(t=window.location.origin?.endsWith(\"/\")?window.location.origin.substring(0,window.location.origin.length-1):window.location.origin||\"\",this.baseUrl.startsWith(\"/\")||(t+=window.location.pathname||\"/\",t+=t.endsWith(\"/\")?\"\":\"/\"),t+=this.baseUrl),e&&(t+=t.endsWith(\"/\")?\"\":\"/\",t+=e.startsWith(\"/\")?e.substring(1):e),t}async send(e,t){t=this.initSendOptions(e,t);let s=this.buildUrl(e);if(this.beforeSend){const e=Object.assign({},await this.beforeSend(s,t));void 0!==e.url||void 0!==e.options?(s=e.url||s,t=e.options||t):Object.keys(e).length&&(t=e,console?.warn&&console.warn(\"Deprecated format of beforeSend return: please use `return { url, options }`, instead of `return options`.\"))}if(void 0!==t.query){const e=this.serializeQueryParams(t.query);e&&(s+=(s.includes(\"?\")?\"&\":\"?\")+e),delete t.query}\"application/json\"==this.getHeader(t.headers,\"Content-Type\")&&t.body&&\"string\"!=typeof t.body&&(t.body=JSON.stringify(t.body));return(t.fetch||fetch)(s,t).then((async e=>{let t={};try{t=await e.json()}catch(e){}if(this.afterSend&&(t=await this.afterSend(e,t)),e.status>=400)throw new ClientResponseError({url:e.url,status:e.status,data:t});return t})).catch((e=>{throw new ClientResponseError(e)}))}initSendOptions(e,t){if((t=Object.assign({method:\"GET\"},t)).body=this.convertToFormDataIfNeeded(t.body),normalizeUnknownQueryParams(t),t.query=Object.assign({},t.params,t.query),void 0===t.requestKey&&(!1===t.$autoCancel||!1===t.query.$autoCancel?t.requestKey=null:(t.$cancelKey||t.query.$cancelKey)&&(t.requestKey=t.$cancelKey||t.query.$cancelKey)),delete t.$autoCancel,delete t.query.$autoCancel,delete t.$cancelKey,delete t.query.$cancelKey,null!==this.getHeader(t.headers,\"Content-Type\")||this.isFormData(t.body)||(t.headers=Object.assign({},t.headers,{\"Content-Type\":\"application/json\"})),null===this.getHeader(t.headers,\"Accept-Language\")&&(t.headers=Object.assign({},t.headers,{\"Accept-Language\":this.lang})),this.authStore.token&&null===this.getHeader(t.headers,\"Authorization\")&&(t.headers=Object.assign({},t.headers,{Authorization:this.authStore.token})),this.enableAutoCancellation&&null!==t.requestKey){const s=t.requestKey||(t.method||\"GET\")+e;delete t.requestKey,this.cancelRequest(s);const i=new AbortController;this.cancelControllers[s]=i,t.signal=i.signal}return t}convertToFormDataIfNeeded(e){if(\"undefined\"==typeof FormData||void 0===e||\"object\"!=typeof e||null===e||this.isFormData(e)||!this.hasBlobField(e))return e;const t=new FormData;for(const s in e){const i=e[s];if(\"object\"!=typeof i||this.hasBlobField({data:i})){const e=Array.isArray(i)?i:[i];for(let i of e)t.append(s,i)}else{let e={};e[s]=i,t.append(\"@jsonPayload\",JSON.stringify(e))}}return t}hasBlobField(e){for(const t in e){const s=Array.isArray(e[t])?e[t]:[e[t]];for(const e of s)if(\"undefined\"!=typeof Blob&&e instanceof Blob||\"undefined\"!=typeof File&&e instanceof File)return!0}return!1}getHeader(e,t){e=e||{},t=t.toLowerCase();for(let s in e)if(s.toLowerCase()==t)return e[s];return null}isFormData(e){return e&&(\"FormData\"===e.constructor.name||\"undefined\"!=typeof FormData&&e instanceof FormData)}serializeQueryParams(e){const t=[];for(const s in e){if(null===e[s])continue;const i=e[s],n=encodeURIComponent(s);if(Array.isArray(i))for(const e of i)t.push(n+\"=\"+encodeURIComponent(e));else i instanceof Date?t.push(n+\"=\"+encodeURIComponent(i.toISOString())):null!==typeof i&&\"object\"==typeof i?t.push(n+\"=\"+encodeURIComponent(JSON.stringify(i))):t.push(n+\"=\"+encodeURIComponent(i))}return t.join(\"&\")}}class AsyncAuthStore extends BaseAuthStore{constructor(e){super(),this.queue=[],this.saveFunc=e.save,this.clearFunc=e.clear,this._enqueue((()=>this._loadInitial(e.initial)))}save(e,t){super.save(e,t);let s=\"\";try{s=JSON.stringify({token:e,model:t})}catch(e){console.warn(\"AsyncAuthStore: failed to stringify the new state\")}this._enqueue((()=>this.saveFunc(s)))}clear(){super.clear(),this.clearFunc?this._enqueue((()=>this.clearFunc())):this._enqueue((()=>this.saveFunc(\"\")))}async _loadInitial(e){try{if(e=await e){let t;\"string\"==typeof e?t=JSON.parse(e)||{}:\"object\"==typeof e&&(t=e),this.save(t.token||\"\",t.model||null)}}catch(e){}}_enqueue(e){this.queue.push(e),1==this.queue.length&&this._dequeue()}_dequeue(){this.queue.length&&this.queue[0]().finally((()=>{this.queue.shift(),this.queue.length&&this._dequeue()}))}}\n//# sourceMappingURL=pocketbase.es.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvcG9ja2V0YmFzZS9kaXN0L3BvY2tldGJhc2UuZXMubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0NBQXdDLGVBQWUsdUVBQXVFLDRhQUE0YSxrckJBQWtyQixXQUFXLHFCQUFxQixTQUFTLE9BQU8sVUFBVSxnREFBZ0QsMEJBQTBCLFdBQVcsK0JBQStCLHdCQUF3QixNQUFNLHdCQUF3QixRQUFRLEtBQUssV0FBVyxFQUFFLHlCQUF5QixnQkFBZ0Isa0JBQWtCLEtBQUsscUJBQXFCLGFBQWEsa0JBQWtCLFNBQVMsU0FBUyw0QkFBNEIsa0JBQWtCLDRCQUE0Qix3Q0FBd0MsSUFBSSxVQUFVLFNBQVMsUUFBUSxNQUFNLFNBQVMsZ0NBQWdDLHdCQUF3QixNQUFNLDRCQUE0Qiw4REFBOEQsYUFBYSxnRUFBZ0UsY0FBYyxtQkFBbUIsbUJBQW1CLDBFQUEwRSxNQUFNLHdCQUF3QixhQUFhLHFFQUFxRSxNQUFNLGtCQUFrQixXQUFXLGlFQUFpRSxNQUFNLGNBQWMsY0FBYyx1QkFBdUIsNkVBQTZFLHlGQUF5RixNQUFNLGtDQUFrQyxzQkFBc0IsNEJBQTRCLHFCQUFxQix3RUFBd0UsZ0JBQWdCLGNBQWMsTUFBTSxtQkFBbUIsaUJBQWlCLE1BQU0saUJBQWlCLGVBQWUsTUFBTSwyREFBMkQsZUFBZSx3RUFBd0UsYUFBYSxpQkFBaUIsTUFBTSxnQkFBZ0IsY0FBYyxNQUFNLG1CQUFtQixpQkFBaUIsTUFBTSxpQkFBaUIsZUFBZSxNQUFNLDJEQUEyRCxTQUFTLDBCQUEwQixrREFBa0QsMEJBQTBCLDZCQUE2Qiw0SEFBNEgsTUFBTSw0QkFBNEIsU0FBUyx5RUFBeUUsd0RBQXdELGFBQWEseUJBQXlCLFVBQVUsU0FBUywrQkFBK0IseUJBQXlCLG1FQUFtRSxpQ0FBaUMsa0NBQWtDLHNHQUFzRyx5QkFBeUIsZ0JBQWdCLHNKQUFzSixTQUFTLE1BQU0sa0JBQWtCLG9CQUFvQixjQUFjLGlFQUFpRSxZQUFZLHNCQUFz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QUE0Qiw4Q0FBOEMsU0FBUyw2QkFBNkIsOEhBQThILHFCQUFxQixrQkFBa0IsYUFBYSwwQ0FBMEMsT0FBTyxHQUFHLCtCQUErQiw2QkFBNkIsS0FBSyxTQUFTLG1EQUFtRCxTQUFTLGdCQUFnQixrQkFBa0Isd0NBQXdDLHNIQUFzSCxTQUFTLGVBQWUsT0FBTyxtQkFBbUIsaURBQWlELFlBQVksY0FBYyxpR0FBaUcsd0JBQXdCLFdBQVcsa0JBQWtCLHdCQUF3QixxQ0FBcUMseUVBQXlFLHFNQUFxTSxvQkFBb0IsMkNBQTJDLGVBQWUsb0hBQW9ILFVBQVUsZ0JBQWdCLFNBQVMsSUFBSSxrQkFBa0IsZ0JBQWdCLEVBQUUsU0FBUyxrRUFBa0Usc0NBQXNDLFFBQVEsMEdBQTBHLHNCQUFzQixJQUFJLGNBQWMsTUFBTSxzQ0FBc0MsaUVBQWlFLFdBQVcsWUFBWSx5REFBeUQsV0FBVyxpREFBaUQsc0RBQXNELElBQXVSO0FBQzN3bUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9sZWFybmluZy1wbGF0Zm9ybS1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9wb2NrZXRiYXNlL2Rpc3QvcG9ja2V0YmFzZS5lcy5tanM/YTY0MiJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBDbGllbnRSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoXCJDbGllbnRSZXNwb25zZUVycm9yXCIpLHRoaXMudXJsPVwiXCIsdGhpcy5zdGF0dXM9MCx0aGlzLnJlc3BvbnNlPXt9LHRoaXMuaXNBYm9ydD0hMSx0aGlzLm9yaWdpbmFsRXJyb3I9bnVsbCxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxDbGllbnRSZXNwb25zZUVycm9yLnByb3RvdHlwZSksbnVsbCE9PWUmJlwib2JqZWN0XCI9PXR5cGVvZiBlJiYodGhpcy51cmw9XCJzdHJpbmdcIj09dHlwZW9mIGUudXJsP2UudXJsOlwiXCIsdGhpcy5zdGF0dXM9XCJudW1iZXJcIj09dHlwZW9mIGUuc3RhdHVzP2Uuc3RhdHVzOjAsdGhpcy5pc0Fib3J0PSEhZS5pc0Fib3J0LHRoaXMub3JpZ2luYWxFcnJvcj1lLm9yaWdpbmFsRXJyb3IsbnVsbCE9PWUucmVzcG9uc2UmJlwib2JqZWN0XCI9PXR5cGVvZiBlLnJlc3BvbnNlP3RoaXMucmVzcG9uc2U9ZS5yZXNwb25zZTpudWxsIT09ZS5kYXRhJiZcIm9iamVjdFwiPT10eXBlb2YgZS5kYXRhP3RoaXMucmVzcG9uc2U9ZS5kYXRhOnRoaXMucmVzcG9uc2U9e30pLHRoaXMub3JpZ2luYWxFcnJvcnx8ZSBpbnN0YW5jZW9mIENsaWVudFJlc3BvbnNlRXJyb3J8fCh0aGlzLm9yaWdpbmFsRXJyb3I9ZSksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIERPTUV4Y2VwdGlvbiYmZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiYmKHRoaXMuaXNBYm9ydD0hMCksdGhpcy5uYW1lPVwiQ2xpZW50UmVzcG9uc2VFcnJvciBcIit0aGlzLnN0YXR1cyx0aGlzLm1lc3NhZ2U9dGhpcy5yZXNwb25zZT8ubWVzc2FnZSx0aGlzLm1lc3NhZ2V8fCh0aGlzLmlzQWJvcnQ/dGhpcy5tZXNzYWdlPVwiVGhlIHJlcXVlc3Qgd2FzIGF1dG9jYW5jZWxsZWQuIFlvdSBjYW4gZmluZCBtb3JlIGluZm8gaW4gaHR0cHM6Ly9naXRodWIuY29tL3BvY2tldGJhc2UvanMtc2RrI2F1dG8tY2FuY2VsbGF0aW9uLlwiOnRoaXMub3JpZ2luYWxFcnJvcj8uY2F1c2U/Lm1lc3NhZ2U/LmluY2x1ZGVzKFwiRUNPTk5SRUZVU0VEIDo6MVwiKT90aGlzLm1lc3NhZ2U9XCJGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgUG9ja2V0QmFzZSBzZXJ2ZXIuIFRyeSBjaGFuZ2luZyB0aGUgU0RLIFVSTCBmcm9tIGxvY2FsaG9zdCB0byAxMjcuMC4wLjEgKGh0dHBzOi8vZ2l0aHViLmNvbS9wb2NrZXRiYXNlL2pzLXNkay9pc3N1ZXMvMjEpLlwiOnRoaXMubWVzc2FnZT1cIlNvbWV0aGluZyB3ZW50IHdyb25nIHdoaWxlIHByb2Nlc3NpbmcgeW91ciByZXF1ZXN0LlwiKX1nZXQgZGF0YSgpe3JldHVybiB0aGlzLnJlc3BvbnNlfXRvSlNPTigpe3JldHVybnsuLi50aGlzfX19Y29uc3QgZT0vXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztmdW5jdGlvbiBjb29raWVQYXJzZShlLHQpe2NvbnN0IHM9e307aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUpcmV0dXJuIHM7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LHR8fHt9KS5kZWNvZGV8fGRlZmF1bHREZWNvZGU7bGV0IG49MDtmb3IoO248ZS5sZW5ndGg7KXtjb25zdCB0PWUuaW5kZXhPZihcIj1cIixuKTtpZigtMT09PXQpYnJlYWs7bGV0IHI9ZS5pbmRleE9mKFwiO1wiLG4pO2lmKC0xPT09cilyPWUubGVuZ3RoO2Vsc2UgaWYocjx0KXtuPWUubGFzdEluZGV4T2YoXCI7XCIsdC0xKSsxO2NvbnRpbnVlfWNvbnN0IG89ZS5zbGljZShuLHQpLnRyaW0oKTtpZih2b2lkIDA9PT1zW29dKXtsZXQgbj1lLnNsaWNlKHQrMSxyKS50cmltKCk7MzQ9PT1uLmNoYXJDb2RlQXQoMCkmJihuPW4uc2xpY2UoMSwtMSkpO3RyeXtzW29dPWkobil9Y2F0Y2goZSl7c1tvXT1ufX1uPXIrMX1yZXR1cm4gc31mdW5jdGlvbiBjb29raWVTZXJpYWxpemUodCxzLGkpe2NvbnN0IG49T2JqZWN0LmFzc2lnbih7fSxpfHx7fSkscj1uLmVuY29kZXx8ZGVmYXVsdEVuY29kZTtpZighZS50ZXN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBuYW1lIGlzIGludmFsaWRcIik7Y29uc3Qgbz1yKHMpO2lmKG8mJiFlLnRlc3QobykpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IHZhbCBpcyBpbnZhbGlkXCIpO2xldCBhPXQrXCI9XCIrbztpZihudWxsIT1uLm1heEFnZSl7Y29uc3QgZT1uLm1heEFnZS0wO2lmKGlzTmFOKGUpfHwhaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBtYXhBZ2UgaXMgaW52YWxpZFwiKTthKz1cIjsgTWF4LUFnZT1cIitNYXRoLmZsb29yKGUpfWlmKG4uZG9tYWluKXtpZighZS50ZXN0KG4uZG9tYWluKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9uIGRvbWFpbiBpcyBpbnZhbGlkXCIpO2ErPVwiOyBEb21haW49XCIrbi5kb21haW59aWYobi5wYXRoKXtpZighZS50ZXN0KG4ucGF0aCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBwYXRoIGlzIGludmFsaWRcIik7YSs9XCI7IFBhdGg9XCIrbi5wYXRofWlmKG4uZXhwaXJlcyl7aWYoIWZ1bmN0aW9uIGlzRGF0ZShlKXtyZXR1cm5cIltvYmplY3QgRGF0ZV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKXx8ZSBpbnN0YW5jZW9mIERhdGV9KG4uZXhwaXJlcyl8fGlzTmFOKG4uZXhwaXJlcy52YWx1ZU9mKCkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gZXhwaXJlcyBpcyBpbnZhbGlkXCIpO2ErPVwiOyBFeHBpcmVzPVwiK24uZXhwaXJlcy50b1VUQ1N0cmluZygpfWlmKG4uaHR0cE9ubHkmJihhKz1cIjsgSHR0cE9ubHlcIiksbi5zZWN1cmUmJihhKz1cIjsgU2VjdXJlXCIpLG4ucHJpb3JpdHkpe3N3aXRjaChcInN0cmluZ1wiPT10eXBlb2Ygbi5wcmlvcml0eT9uLnByaW9yaXR5LnRvTG93ZXJDYXNlKCk6bi5wcmlvcml0eSl7Y2FzZVwibG93XCI6YSs9XCI7IFByaW9yaXR5PUxvd1wiO2JyZWFrO2Nhc2VcIm1lZGl1bVwiOmErPVwiOyBQcmlvcml0eT1NZWRpdW1cIjticmVhaztjYXNlXCJoaWdoXCI6YSs9XCI7IFByaW9yaXR5PUhpZ2hcIjticmVhaztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gcHJpb3JpdHkgaXMgaW52YWxpZFwiKX19aWYobi5zYW1lU2l0ZSl7c3dpdGNoKFwic3RyaW5nXCI9PXR5cGVvZiBuLnNhbWVTaXRlP24uc2FtZVNpdGUudG9Mb3dlckNhc2UoKTpuLnNhbWVTaXRlKXtjYXNlITA6YSs9XCI7IFNhbWVTaXRlPVN0cmljdFwiO2JyZWFrO2Nhc2VcImxheFwiOmErPVwiOyBTYW1lU2l0ZT1MYXhcIjticmVhaztjYXNlXCJzdHJpY3RcIjphKz1cIjsgU2FtZVNpdGU9U3RyaWN0XCI7YnJlYWs7Y2FzZVwibm9uZVwiOmErPVwiOyBTYW1lU2l0ZT1Ob25lXCI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9uIHNhbWVTaXRlIGlzIGludmFsaWRcIil9fXJldHVybiBhfWZ1bmN0aW9uIGRlZmF1bHREZWNvZGUoZSl7cmV0dXJuLTEhPT1lLmluZGV4T2YoXCIlXCIpP2RlY29kZVVSSUNvbXBvbmVudChlKTplfWZ1bmN0aW9uIGRlZmF1bHRFbmNvZGUoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX1jb25zdCB0PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlwiUmVhY3ROYXRpdmVcIj09PW5hdmlnYXRvci5wcm9kdWN0fHxcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwuSGVybWVzSW50ZXJuYWw7bGV0IHM7ZnVuY3Rpb24gZ2V0VG9rZW5QYXlsb2FkKGUpe2lmKGUpdHJ5e2NvbnN0IHQ9ZGVjb2RlVVJJQ29tcG9uZW50KHMoZS5zcGxpdChcIi5cIilbMV0pLnNwbGl0KFwiXCIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuXCIlXCIrKFwiMDBcIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KSkuam9pbihcIlwiKSk7cmV0dXJuIEpTT04ucGFyc2UodCl8fHt9fWNhdGNoKGUpe31yZXR1cm57fX1mdW5jdGlvbiBpc1Rva2VuRXhwaXJlZChlLHQ9MCl7bGV0IHM9Z2V0VG9rZW5QYXlsb2FkKGUpO3JldHVybiEoT2JqZWN0LmtleXMocykubGVuZ3RoPjAmJighcy5leHB8fHMuZXhwLXQ+RGF0ZS5ub3coKS8xZTMpKX1zPVwiZnVuY3Rpb25cIiE9dHlwZW9mIGF0b2J8fHQ/ZT0+e2xldCB0PVN0cmluZyhlKS5yZXBsYWNlKC89KyQvLFwiXCIpO2lmKHQubGVuZ3RoJTQ9PTEpdGhyb3cgbmV3IEVycm9yKFwiJ2F0b2InIGZhaWxlZDogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5cIik7Zm9yKHZhciBzLGksbj0wLHI9MCxvPVwiXCI7aT10LmNoYXJBdChyKyspO35pJiYocz1uJTQ/NjQqcytpOmksbisrJTQpP28rPVN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JnM+PigtMipuJjYpKTowKWk9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2YoaSk7cmV0dXJuIG99OmF0b2I7Y29uc3QgaT1cInBiX2F1dGhcIjtjbGFzcyBCYXNlQXV0aFN0b3Jle2NvbnN0cnVjdG9yKCl7dGhpcy5iYXNlVG9rZW49XCJcIix0aGlzLmJhc2VNb2RlbD1udWxsLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2tzPVtdfWdldCB0b2tlbigpe3JldHVybiB0aGlzLmJhc2VUb2tlbn1nZXQgbW9kZWwoKXtyZXR1cm4gdGhpcy5iYXNlTW9kZWx9Z2V0IGlzVmFsaWQoKXtyZXR1cm4haXNUb2tlbkV4cGlyZWQodGhpcy50b2tlbil9Z2V0IGlzQWRtaW4oKXtyZXR1cm5cImFkbWluXCI9PT1nZXRUb2tlblBheWxvYWQodGhpcy50b2tlbikudHlwZX1nZXQgaXNBdXRoUmVjb3JkKCl7cmV0dXJuXCJhdXRoUmVjb3JkXCI9PT1nZXRUb2tlblBheWxvYWQodGhpcy50b2tlbikudHlwZX1zYXZlKGUsdCl7dGhpcy5iYXNlVG9rZW49ZXx8XCJcIix0aGlzLmJhc2VNb2RlbD10fHxudWxsLHRoaXMudHJpZ2dlckNoYW5nZSgpfWNsZWFyKCl7dGhpcy5iYXNlVG9rZW49XCJcIix0aGlzLmJhc2VNb2RlbD1udWxsLHRoaXMudHJpZ2dlckNoYW5nZSgpfWxvYWRGcm9tQ29va2llKGUsdD1pKXtjb25zdCBzPWNvb2tpZVBhcnNlKGV8fFwiXCIpW3RdfHxcIlwiO2xldCBuPXt9O3RyeXtuPUpTT04ucGFyc2UocyksKG51bGw9PT10eXBlb2Ygbnx8XCJvYmplY3RcIiE9dHlwZW9mIG58fEFycmF5LmlzQXJyYXkobikpJiYobj17fSl9Y2F0Y2goZSl7fXRoaXMuc2F2ZShuLnRva2VufHxcIlwiLG4ubW9kZWx8fG51bGwpfWV4cG9ydFRvQ29va2llKGUsdD1pKXtjb25zdCBzPXtzZWN1cmU6ITAsc2FtZVNpdGU6ITAsaHR0cE9ubHk6ITAscGF0aDpcIi9cIn0sbj1nZXRUb2tlblBheWxvYWQodGhpcy50b2tlbik7cy5leHBpcmVzPW4/LmV4cD9uZXcgRGF0ZSgxZTMqbi5leHApOm5ldyBEYXRlKFwiMTk3MC0wMS0wMVwiKSxlPU9iamVjdC5hc3NpZ24oe30scyxlKTtjb25zdCByPXt0b2tlbjp0aGlzLnRva2VuLG1vZGVsOnRoaXMubW9kZWw/SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsKSk6bnVsbH07bGV0IG89Y29va2llU2VyaWFsaXplKHQsSlNPTi5zdHJpbmdpZnkociksZSk7Y29uc3QgYT1cInVuZGVmaW5lZFwiIT10eXBlb2YgQmxvYj9uZXcgQmxvYihbb10pLnNpemU6by5sZW5ndGg7aWYoci5tb2RlbCYmYT40MDk2KXtyLm1vZGVsPXtpZDpyPy5tb2RlbD8uaWQsZW1haWw6cj8ubW9kZWw/LmVtYWlsfTtjb25zdCBzPVtcImNvbGxlY3Rpb25JZFwiLFwidXNlcm5hbWVcIixcInZlcmlmaWVkXCJdO2Zvcihjb25zdCBlIGluIHRoaXMubW9kZWwpcy5pbmNsdWRlcyhlKSYmKHIubW9kZWxbZV09dGhpcy5tb2RlbFtlXSk7bz1jb29raWVTZXJpYWxpemUodCxKU09OLnN0cmluZ2lmeShyKSxlKX1yZXR1cm4gb31vbkNoYW5nZShlLHQ9ITEpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrcy5wdXNoKGUpLHQmJmUodGhpcy50b2tlbix0aGlzLm1vZGVsKSwoKT0+e2ZvcihsZXQgdD10aGlzLl9vbkNoYW5nZUNhbGxiYWNrcy5sZW5ndGgtMTt0Pj0wO3QtLSlpZih0aGlzLl9vbkNoYW5nZUNhbGxiYWNrc1t0XT09ZSlyZXR1cm4gZGVsZXRlIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2tzW3RdLHZvaWQgdGhpcy5fb25DaGFuZ2VDYWxsYmFja3Muc3BsaWNlKHQsMSl9fXRyaWdnZXJDaGFuZ2UoKXtmb3IoY29uc3QgZSBvZiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrcyllJiZlKHRoaXMudG9rZW4sdGhpcy5tb2RlbCl9fWNsYXNzIExvY2FsQXV0aFN0b3JlIGV4dGVuZHMgQmFzZUF1dGhTdG9yZXtjb25zdHJ1Y3RvcihlPVwicG9ja2V0YmFzZV9hdXRoXCIpe3N1cGVyKCksdGhpcy5zdG9yYWdlRmFsbGJhY2s9e30sdGhpcy5zdG9yYWdlS2V5PWUsdGhpcy5fYmluZFN0b3JhZ2VFdmVudCgpfWdldCB0b2tlbigpe3JldHVybih0aGlzLl9zdG9yYWdlR2V0KHRoaXMuc3RvcmFnZUtleSl8fHt9KS50b2tlbnx8XCJcIn1nZXQgbW9kZWwoKXtyZXR1cm4odGhpcy5fc3RvcmFnZUdldCh0aGlzLnN0b3JhZ2VLZXkpfHx7fSkubW9kZWx8fG51bGx9c2F2ZShlLHQpe3RoaXMuX3N0b3JhZ2VTZXQodGhpcy5zdG9yYWdlS2V5LHt0b2tlbjplLG1vZGVsOnR9KSxzdXBlci5zYXZlKGUsdCl9Y2xlYXIoKXt0aGlzLl9zdG9yYWdlUmVtb3ZlKHRoaXMuc3RvcmFnZUtleSksc3VwZXIuY2xlYXIoKX1fc3RvcmFnZUdldChlKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c/LmxvY2FsU3RvcmFnZSl7Y29uc3QgdD13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oZSl8fFwiXCI7dHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3JldHVybiB0fX1yZXR1cm4gdGhpcy5zdG9yYWdlRmFsbGJhY2tbZV19X3N0b3JhZ2VTZXQoZSx0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c/LmxvY2FsU3RvcmFnZSl7bGV0IHM9dDtcInN0cmluZ1wiIT10eXBlb2YgdCYmKHM9SlNPTi5zdHJpbmdpZnkodCkpLHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLHMpfWVsc2UgdGhpcy5zdG9yYWdlRmFsbGJhY2tbZV09dH1fc3RvcmFnZVJlbW92ZShlKXtcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c/LmxvY2FsU3RvcmFnZSYmd2luZG93LmxvY2FsU3RvcmFnZT8ucmVtb3ZlSXRlbShlKSxkZWxldGUgdGhpcy5zdG9yYWdlRmFsbGJhY2tbZV19X2JpbmRTdG9yYWdlRXZlbnQoKXtcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c/LmxvY2FsU3RvcmFnZSYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic3RvcmFnZVwiLChlPT57aWYoZS5rZXkhPXRoaXMuc3RvcmFnZUtleSlyZXR1cm47Y29uc3QgdD10aGlzLl9zdG9yYWdlR2V0KHRoaXMuc3RvcmFnZUtleSl8fHt9O3N1cGVyLnNhdmUodC50b2tlbnx8XCJcIix0Lm1vZGVsfHxudWxsKX0pKX19Y2xhc3MgQmFzZVNlcnZpY2V7Y29uc3RydWN0b3IoZSl7dGhpcy5jbGllbnQ9ZX19Y2xhc3MgU2V0dGluZ3NTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2V7YXN5bmMgZ2V0QWxsKGUpe3JldHVybiBlPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkdFVFwifSxlKSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9zZXR0aW5nc1wiLGUpfWFzeW5jIHVwZGF0ZShlLHQpe3JldHVybiB0PU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIlBBVENIXCIsYm9keTplfSx0KSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9zZXR0aW5nc1wiLHQpfWFzeW5jIHRlc3RTMyhlPVwic3RvcmFnZVwiLHQpe3JldHVybiB0PU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIlBPU1RcIixib2R5OntmaWxlc3lzdGVtOmV9fSx0KSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9zZXR0aW5ncy90ZXN0L3MzXCIsdCkudGhlbigoKCk9PiEwKSl9YXN5bmMgdGVzdEVtYWlsKGUsdCxzKXtyZXR1cm4gcz1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCIsYm9keTp7ZW1haWw6ZSx0ZW1wbGF0ZTp0fX0scyksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvc2V0dGluZ3MvdGVzdC9lbWFpbFwiLHMpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIGdlbmVyYXRlQXBwbGVDbGllbnRTZWNyZXQoZSx0LHMsaSxuLHIpe3JldHVybiByPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIlBPU1RcIixib2R5OntjbGllbnRJZDplLHRlYW1JZDp0LGtleUlkOnMscHJpdmF0ZUtleTppLGR1cmF0aW9uOm59fSxyKSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9zZXR0aW5ncy9hcHBsZS9nZW5lcmF0ZS1jbGllbnQtc2VjcmV0XCIscil9fWNsYXNzIENydWRTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2V7ZGVjb2RlKGUpe3JldHVybiBlfWFzeW5jIGdldEZ1bGxMaXN0KGUsdCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpcmV0dXJuIHRoaXMuX2dldEZ1bGxMaXN0KGUsdCk7bGV0IHM9NTAwO3JldHVybih0PU9iamVjdC5hc3NpZ24oe30sZSx0KSkuYmF0Y2gmJihzPXQuYmF0Y2gsZGVsZXRlIHQuYmF0Y2gpLHRoaXMuX2dldEZ1bGxMaXN0KHMsdCl9YXN5bmMgZ2V0TGlzdChlPTEsdD0zMCxzKXtyZXR1cm4ocz1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0scykpLnF1ZXJ5PU9iamVjdC5hc3NpZ24oe3BhZ2U6ZSxwZXJQYWdlOnR9LHMucXVlcnkpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgscykudGhlbigoZT0+KGUuaXRlbXM9ZS5pdGVtcz8ubWFwKChlPT50aGlzLmRlY29kZShlKSkpfHxbXSxlKSkpfWFzeW5jIGdldEZpcnN0TGlzdEl0ZW0oZSx0KXtyZXR1cm4odD1PYmplY3QuYXNzaWduKHtyZXF1ZXN0S2V5Olwib25lX2J5X2ZpbHRlcl9cIit0aGlzLmJhc2VDcnVkUGF0aCtcIl9cIitlfSx0KSkucXVlcnk9T2JqZWN0LmFzc2lnbih7ZmlsdGVyOmUsc2tpcFRvdGFsOjF9LHQucXVlcnkpLHRoaXMuZ2V0TGlzdCgxLDEsdCkudGhlbigoZT0+e2lmKCFlPy5pdGVtcz8ubGVuZ3RoKXRocm93IG5ldyBDbGllbnRSZXNwb25zZUVycm9yKHtzdGF0dXM6NDA0LHJlc3BvbnNlOntjb2RlOjQwNCxtZXNzYWdlOlwiVGhlIHJlcXVlc3RlZCByZXNvdXJjZSB3YXNuJ3QgZm91bmQuXCIsZGF0YTp7fX19KTtyZXR1cm4gZS5pdGVtc1swXX0pKX1hc3luYyBnZXRPbmUoZSx0KXtpZighZSl0aHJvdyBuZXcgQ2xpZW50UmVzcG9uc2VFcnJvcih7dXJsOnRoaXMuY2xpZW50LmJ1aWxkVXJsKHRoaXMuYmFzZUNydWRQYXRoK1wiL1wiKSxzdGF0dXM6NDA0LHJlc3BvbnNlOntjb2RlOjQwNCxtZXNzYWdlOlwiTWlzc2luZyByZXF1aXJlZCByZWNvcmQgaWQuXCIsZGF0YTp7fX19KTtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0sdCksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9cIitlbmNvZGVVUklDb21wb25lbnQoZSksdCkudGhlbigoZT0+dGhpcy5kZWNvZGUoZSkpKX1hc3luYyBjcmVhdGUoZSx0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCIsYm9keTplfSx0KSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNydWRQYXRoLHQpLnRoZW4oKGU9PnRoaXMuZGVjb2RlKGUpKSl9YXN5bmMgdXBkYXRlKGUsdCxzKXtyZXR1cm4gcz1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQQVRDSFwiLGJvZHk6dH0scyksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9cIitlbmNvZGVVUklDb21wb25lbnQoZSkscykudGhlbigoZT0+dGhpcy5kZWNvZGUoZSkpKX1hc3luYyBkZWxldGUoZSx0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJERUxFVEVcIn0sdCksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9cIitlbmNvZGVVUklDb21wb25lbnQoZSksdCkudGhlbigoKCk9PiEwKSl9X2dldEZ1bGxMaXN0KGU9NTAwLHQpeyh0PXR8fHt9KS5xdWVyeT1PYmplY3QuYXNzaWduKHtza2lwVG90YWw6MX0sdC5xdWVyeSk7bGV0IHM9W10scmVxdWVzdD1hc3luYyBpPT50aGlzLmdldExpc3QoaSxlfHw1MDAsdCkudGhlbigoZT0+e2NvbnN0IHQ9ZS5pdGVtcztyZXR1cm4gcz1zLmNvbmNhdCh0KSx0Lmxlbmd0aD09ZS5wZXJQYWdlP3JlcXVlc3QoaSsxKTpzfSkpO3JldHVybiByZXF1ZXN0KDEpfX1mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhlLHQscyxpKXtjb25zdCBuPXZvaWQgMCE9PWk7cmV0dXJuIG58fHZvaWQgMCE9PXM/bj8oY29uc29sZS53YXJuKGUpLHQuYm9keT1PYmplY3QuYXNzaWduKHt9LHQuYm9keSxzKSx0LnF1ZXJ5PU9iamVjdC5hc3NpZ24oe30sdC5xdWVyeSxpKSx0KTpPYmplY3QuYXNzaWduKHQscyk6dH1mdW5jdGlvbiByZXNldEF1dG9SZWZyZXNoKGUpe2UuX3Jlc2V0QXV0b1JlZnJlc2g/LigpfWNsYXNzIEFkbWluU2VydmljZSBleHRlbmRzIENydWRTZXJ2aWNle2dldCBiYXNlQ3J1ZFBhdGgoKXtyZXR1cm5cIi9hcGkvYWRtaW5zXCJ9YXN5bmMgdXBkYXRlKGUsdCxzKXtyZXR1cm4gc3VwZXIudXBkYXRlKGUsdCxzKS50aGVuKChlPT4odGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsPy5pZD09PWUuaWQmJnZvaWQgMD09PXRoaXMuY2xpZW50LmF1dGhTdG9yZS5tb2RlbD8uY29sbGVjdGlvbklkJiZ0aGlzLmNsaWVudC5hdXRoU3RvcmUuc2F2ZSh0aGlzLmNsaWVudC5hdXRoU3RvcmUudG9rZW4sZSksZSkpKX1hc3luYyBkZWxldGUoZSx0KXtyZXR1cm4gc3VwZXIuZGVsZXRlKGUsdCkudGhlbigodD0+KHQmJnRoaXMuY2xpZW50LmF1dGhTdG9yZS5tb2RlbD8uaWQ9PT1lJiZ2b2lkIDA9PT10aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmNvbGxlY3Rpb25JZCYmdGhpcy5jbGllbnQuYXV0aFN0b3JlLmNsZWFyKCksdCkpKX1hdXRoUmVzcG9uc2UoZSl7Y29uc3QgdD10aGlzLmRlY29kZShlPy5hZG1pbnx8e30pO3JldHVybiBlPy50b2tlbiYmZT8uYWRtaW4mJnRoaXMuY2xpZW50LmF1dGhTdG9yZS5zYXZlKGUudG9rZW4sdCksT2JqZWN0LmFzc2lnbih7fSxlLHt0b2tlbjplPy50b2tlbnx8XCJcIixhZG1pbjp0fSl9YXN5bmMgYXV0aFdpdGhQYXNzd29yZChlLHQscyxpKXtsZXQgbj17bWV0aG9kOlwiUE9TVFwiLGJvZHk6e2lkZW50aXR5OmUscGFzc3dvcmQ6dH19O249bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgYXV0aFdpdGhQYXNzd29yZChlbWFpbCwgcGFzcywgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggYXV0aFdpdGhQYXNzd29yZChlbWFpbCwgcGFzcywgb3B0aW9ucz8pLlwiLG4scyxpKTtjb25zdCByPW4uYXV0b1JlZnJlc2hUaHJlc2hvbGQ7ZGVsZXRlIG4uYXV0b1JlZnJlc2hUaHJlc2hvbGQsbi5hdXRvUmVmcmVzaHx8cmVzZXRBdXRvUmVmcmVzaCh0aGlzLmNsaWVudCk7bGV0IG89YXdhaXQgdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9hdXRoLXdpdGgtcGFzc3dvcmRcIixuKTtyZXR1cm4gbz10aGlzLmF1dGhSZXNwb25zZShvKSxyJiZmdW5jdGlvbiByZWdpc3RlckF1dG9SZWZyZXNoKGUsdCxzLGkpe3Jlc2V0QXV0b1JlZnJlc2goZSk7Y29uc3Qgbj1lLmJlZm9yZVNlbmQscj1lLmF1dGhTdG9yZS5tb2RlbCxvPWUuYXV0aFN0b3JlLm9uQ2hhbmdlKCgodCxzKT0+eyghdHx8cz8uaWQhPXI/LmlkfHwocz8uY29sbGVjdGlvbklkfHxyPy5jb2xsZWN0aW9uSWQpJiZzPy5jb2xsZWN0aW9uSWQhPXI/LmNvbGxlY3Rpb25JZCkmJnJlc2V0QXV0b1JlZnJlc2goZSl9KSk7ZS5fcmVzZXRBdXRvUmVmcmVzaD1mdW5jdGlvbigpe28oKSxlLmJlZm9yZVNlbmQ9bixkZWxldGUgZS5fcmVzZXRBdXRvUmVmcmVzaH0sZS5iZWZvcmVTZW5kPWFzeW5jKHIsbyk9Pntjb25zdCBhPWUuYXV0aFN0b3JlLnRva2VuO2lmKG8ucXVlcnk/LmF1dG9SZWZyZXNoKXJldHVybiBuP24ocixvKTp7dXJsOnIsc2VuZE9wdGlvbnM6b307bGV0IGM9ZS5hdXRoU3RvcmUuaXNWYWxpZDtpZihjJiZpc1Rva2VuRXhwaXJlZChlLmF1dGhTdG9yZS50b2tlbix0KSl0cnl7YXdhaXQgcygpfWNhdGNoKGUpe2M9ITF9Y3x8YXdhaXQgaSgpO2NvbnN0IGw9by5oZWFkZXJzfHx7fTtmb3IobGV0IHQgaW4gbClpZihcImF1dGhvcml6YXRpb25cIj09dC50b0xvd2VyQ2FzZSgpJiZhPT1sW3RdJiZlLmF1dGhTdG9yZS50b2tlbil7bFt0XT1lLmF1dGhTdG9yZS50b2tlbjticmVha31yZXR1cm4gby5oZWFkZXJzPWwsbj9uKHIsbyk6e3VybDpyLHNlbmRPcHRpb25zOm99fX0odGhpcy5jbGllbnQsciwoKCk9PnRoaXMuYXV0aFJlZnJlc2goe2F1dG9SZWZyZXNoOiEwfSkpLCgoKT0+dGhpcy5hdXRoV2l0aFBhc3N3b3JkKGUsdCxPYmplY3QuYXNzaWduKHthdXRvUmVmcmVzaDohMH0sbikpKSksb31hc3luYyBhdXRoUmVmcmVzaChlLHQpe2xldCBzPXttZXRob2Q6XCJQT1NUXCJ9O3JldHVybiBzPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIGF1dGhSZWZyZXNoKGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIGF1dGhSZWZyZXNoKG9wdGlvbnM/KS5cIixzLGUsdCksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9hdXRoLXJlZnJlc2hcIixzKS50aGVuKHRoaXMuYXV0aFJlc3BvbnNlLmJpbmQodGhpcykpfWFzeW5jIHJlcXVlc3RQYXNzd29yZFJlc2V0KGUsdCxzKXtsZXQgaT17bWV0aG9kOlwiUE9TVFwiLGJvZHk6e2VtYWlsOmV9fTtyZXR1cm4gaT1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiByZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggcmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIG9wdGlvbnM/KS5cIixpLHQscyksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0XCIsaSkudGhlbigoKCk9PiEwKSl9YXN5bmMgY29uZmlybVBhc3N3b3JkUmVzZXQoZSx0LHMsaSxuKXtsZXQgcj17bWV0aG9kOlwiUE9TVFwiLGJvZHk6e3Rva2VuOmUscGFzc3dvcmQ6dCxwYXNzd29yZENvbmZpcm06c319O3JldHVybiByPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIGNvbmZpcm1QYXNzd29yZFJlc2V0KHJlc2V0VG9rZW4sIHBhc3N3b3JkLCBwYXNzd29yZENvbmZpcm0sIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIGNvbmZpcm1QYXNzd29yZFJlc2V0KHJlc2V0VG9rZW4sIHBhc3N3b3JkLCBwYXNzd29yZENvbmZpcm0sIG9wdGlvbnM/KS5cIixyLGksbiksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9jb25maXJtLXBhc3N3b3JkLXJlc2V0XCIscikudGhlbigoKCk9PiEwKSl9fWNvbnN0IG49W1wicmVxdWVzdEtleVwiLFwiJGNhbmNlbEtleVwiLFwiJGF1dG9DYW5jZWxcIixcImZldGNoXCIsXCJoZWFkZXJzXCIsXCJib2R5XCIsXCJxdWVyeVwiLFwicGFyYW1zXCIsXCJjYWNoZVwiLFwiY3JlZGVudGlhbHNcIixcImhlYWRlcnNcIixcImludGVncml0eVwiLFwia2VlcGFsaXZlXCIsXCJtZXRob2RcIixcIm1vZGVcIixcInJlZGlyZWN0XCIsXCJyZWZlcnJlclwiLFwicmVmZXJyZXJQb2xpY3lcIixcInNpZ25hbFwiLFwid2luZG93XCJdO2Z1bmN0aW9uIG5vcm1hbGl6ZVVua25vd25RdWVyeVBhcmFtcyhlKXtpZihlKXtlLnF1ZXJ5PWUucXVlcnl8fHt9O2ZvcihsZXQgdCBpbiBlKW4uaW5jbHVkZXModCl8fChlLnF1ZXJ5W3RdPWVbdF0sZGVsZXRlIGVbdF0pfX1jbGFzcyBSZWFsdGltZVNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jbGllbnRJZD1cIlwiLHRoaXMuZXZlbnRTb3VyY2U9bnVsbCx0aGlzLnN1YnNjcmlwdGlvbnM9e30sdGhpcy5sYXN0U2VudFN1YnNjcmlwdGlvbnM9W10sdGhpcy5tYXhDb25uZWN0VGltZW91dD0xNWUzLHRoaXMucmVjb25uZWN0QXR0ZW1wdHM9MCx0aGlzLm1heFJlY29ubmVjdEF0dGVtcHRzPTEvMCx0aGlzLnByZWRlZmluZWRSZWNvbm5lY3RJbnRlcnZhbHM9WzIwMCwzMDAsNTAwLDFlMywxMjAwLDE1MDAsMmUzXSx0aGlzLnBlbmRpbmdDb25uZWN0cz1bXX1nZXQgaXNDb25uZWN0ZWQoKXtyZXR1cm4hIXRoaXMuZXZlbnRTb3VyY2UmJiEhdGhpcy5jbGllbnRJZCYmIXRoaXMucGVuZGluZ0Nvbm5lY3RzLmxlbmd0aH1hc3luYyBzdWJzY3JpYmUoZSx0LHMpe2lmKCFlKXRocm93IG5ldyBFcnJvcihcInRvcGljIG11c3QgYmUgc2V0LlwiKTtsZXQgaT1lO2lmKHMpe25vcm1hbGl6ZVVua25vd25RdWVyeVBhcmFtcyhzPU9iamVjdC5hc3NpZ24oe30scykpO2NvbnN0IGU9XCJvcHRpb25zPVwiK2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7cXVlcnk6cy5xdWVyeSxoZWFkZXJzOnMuaGVhZGVyc30pKTtpKz0oaS5pbmNsdWRlcyhcIj9cIik/XCImXCI6XCI/XCIpK2V9Y29uc3QgbGlzdGVuZXI9ZnVuY3Rpb24oZSl7Y29uc3Qgcz1lO2xldCBpO3RyeXtpPUpTT04ucGFyc2Uocz8uZGF0YSl9Y2F0Y2h7fXQoaXx8e30pfTtyZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zW2ldfHwodGhpcy5zdWJzY3JpcHRpb25zW2ldPVtdKSx0aGlzLnN1YnNjcmlwdGlvbnNbaV0ucHVzaChsaXN0ZW5lciksdGhpcy5pc0Nvbm5lY3RlZD8xPT09dGhpcy5zdWJzY3JpcHRpb25zW2ldLmxlbmd0aD9hd2FpdCB0aGlzLnN1Ym1pdFN1YnNjcmlwdGlvbnMoKTp0aGlzLmV2ZW50U291cmNlPy5hZGRFdmVudExpc3RlbmVyKGksbGlzdGVuZXIpOmF3YWl0IHRoaXMuY29ubmVjdCgpLGFzeW5jKCk9PnRoaXMudW5zdWJzY3JpYmVCeVRvcGljQW5kTGlzdGVuZXIoZSxsaXN0ZW5lcil9YXN5bmMgdW5zdWJzY3JpYmUoZSl7bGV0IHQ9ITE7aWYoZSl7Y29uc3Qgcz10aGlzLmdldFN1YnNjcmlwdGlvbnNCeVRvcGljKGUpO2ZvcihsZXQgZSBpbiBzKWlmKHRoaXMuaGFzU3Vic2NyaXB0aW9uTGlzdGVuZXJzKGUpKXtmb3IobGV0IHQgb2YgdGhpcy5zdWJzY3JpcHRpb25zW2VdKXRoaXMuZXZlbnRTb3VyY2U/LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KTtkZWxldGUgdGhpcy5zdWJzY3JpcHRpb25zW2VdLHR8fCh0PSEwKX19ZWxzZSB0aGlzLnN1YnNjcmlwdGlvbnM9e307dGhpcy5oYXNTdWJzY3JpcHRpb25MaXN0ZW5lcnMoKT90JiZhd2FpdCB0aGlzLnN1Ym1pdFN1YnNjcmlwdGlvbnMoKTp0aGlzLmRpc2Nvbm5lY3QoKX1hc3luYyB1bnN1YnNjcmliZUJ5UHJlZml4KGUpe2xldCB0PSExO2ZvcihsZXQgcyBpbiB0aGlzLnN1YnNjcmlwdGlvbnMpaWYoKHMrXCI/XCIpLnN0YXJ0c1dpdGgoZSkpe3Q9ITA7Zm9yKGxldCBlIG9mIHRoaXMuc3Vic2NyaXB0aW9uc1tzXSl0aGlzLmV2ZW50U291cmNlPy5yZW1vdmVFdmVudExpc3RlbmVyKHMsZSk7ZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tzXX10JiYodGhpcy5oYXNTdWJzY3JpcHRpb25MaXN0ZW5lcnMoKT9hd2FpdCB0aGlzLnN1Ym1pdFN1YnNjcmlwdGlvbnMoKTp0aGlzLmRpc2Nvbm5lY3QoKSl9YXN5bmMgdW5zdWJzY3JpYmVCeVRvcGljQW5kTGlzdGVuZXIoZSx0KXtsZXQgcz0hMTtjb25zdCBpPXRoaXMuZ2V0U3Vic2NyaXB0aW9uc0J5VG9waWMoZSk7Zm9yKGxldCBlIGluIGkpe2lmKCFBcnJheS5pc0FycmF5KHRoaXMuc3Vic2NyaXB0aW9uc1tlXSl8fCF0aGlzLnN1YnNjcmlwdGlvbnNbZV0ubGVuZ3RoKWNvbnRpbnVlO2xldCBpPSExO2ZvcihsZXQgcz10aGlzLnN1YnNjcmlwdGlvbnNbZV0ubGVuZ3RoLTE7cz49MDtzLS0pdGhpcy5zdWJzY3JpcHRpb25zW2VdW3NdPT09dCYmKGk9ITAsZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tlXVtzXSx0aGlzLnN1YnNjcmlwdGlvbnNbZV0uc3BsaWNlKHMsMSksdGhpcy5ldmVudFNvdXJjZT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpKTtpJiYodGhpcy5zdWJzY3JpcHRpb25zW2VdLmxlbmd0aHx8ZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tlXSxzfHx0aGlzLmhhc1N1YnNjcmlwdGlvbkxpc3RlbmVycyhlKXx8KHM9ITApKX10aGlzLmhhc1N1YnNjcmlwdGlvbkxpc3RlbmVycygpP3MmJmF3YWl0IHRoaXMuc3VibWl0U3Vic2NyaXB0aW9ucygpOnRoaXMuZGlzY29ubmVjdCgpfWhhc1N1YnNjcmlwdGlvbkxpc3RlbmVycyhlKXtpZih0aGlzLnN1YnNjcmlwdGlvbnM9dGhpcy5zdWJzY3JpcHRpb25zfHx7fSxlKXJldHVybiEhdGhpcy5zdWJzY3JpcHRpb25zW2VdPy5sZW5ndGg7Zm9yKGxldCBlIGluIHRoaXMuc3Vic2NyaXB0aW9ucylpZih0aGlzLnN1YnNjcmlwdGlvbnNbZV0/Lmxlbmd0aClyZXR1cm4hMDtyZXR1cm4hMX1hc3luYyBzdWJtaXRTdWJzY3JpcHRpb25zKCl7aWYodGhpcy5jbGllbnRJZClyZXR1cm4gdGhpcy5hZGRBbGxTdWJzY3JpcHRpb25MaXN0ZW5lcnMoKSx0aGlzLmxhc3RTZW50U3Vic2NyaXB0aW9ucz10aGlzLmdldE5vbkVtcHR5U3Vic2NyaXB0aW9uS2V5cygpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL3JlYWx0aW1lXCIse21ldGhvZDpcIlBPU1RcIixib2R5OntjbGllbnRJZDp0aGlzLmNsaWVudElkLHN1YnNjcmlwdGlvbnM6dGhpcy5sYXN0U2VudFN1YnNjcmlwdGlvbnN9LHJlcXVlc3RLZXk6dGhpcy5nZXRTdWJzY3JpcHRpb25zQ2FuY2VsS2V5KCl9KS5jYXRjaCgoZT0+e2lmKCFlPy5pc0Fib3J0KXRocm93IGV9KSl9Z2V0U3Vic2NyaXB0aW9uc0NhbmNlbEtleSgpe3JldHVyblwicmVhbHRpbWVfXCIrdGhpcy5jbGllbnRJZH1nZXRTdWJzY3JpcHRpb25zQnlUb3BpYyhlKXtjb25zdCB0PXt9O2U9ZS5pbmNsdWRlcyhcIj9cIik/ZTplK1wiP1wiO2ZvcihsZXQgcyBpbiB0aGlzLnN1YnNjcmlwdGlvbnMpKHMrXCI/XCIpLnN0YXJ0c1dpdGgoZSkmJih0W3NdPXRoaXMuc3Vic2NyaXB0aW9uc1tzXSk7cmV0dXJuIHR9Z2V0Tm9uRW1wdHlTdWJzY3JpcHRpb25LZXlzKCl7Y29uc3QgZT1bXTtmb3IobGV0IHQgaW4gdGhpcy5zdWJzY3JpcHRpb25zKXRoaXMuc3Vic2NyaXB0aW9uc1t0XS5sZW5ndGgmJmUucHVzaCh0KTtyZXR1cm4gZX1hZGRBbGxTdWJzY3JpcHRpb25MaXN0ZW5lcnMoKXtpZih0aGlzLmV2ZW50U291cmNlKXt0aGlzLnJlbW92ZUFsbFN1YnNjcmlwdGlvbkxpc3RlbmVycygpO2ZvcihsZXQgZSBpbiB0aGlzLnN1YnNjcmlwdGlvbnMpZm9yKGxldCB0IG9mIHRoaXMuc3Vic2NyaXB0aW9uc1tlXSl0aGlzLmV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoZSx0KX19cmVtb3ZlQWxsU3Vic2NyaXB0aW9uTGlzdGVuZXJzKCl7aWYodGhpcy5ldmVudFNvdXJjZSlmb3IobGV0IGUgaW4gdGhpcy5zdWJzY3JpcHRpb25zKWZvcihsZXQgdCBvZiB0aGlzLnN1YnNjcmlwdGlvbnNbZV0pdGhpcy5ldmVudFNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl9YXN5bmMgY29ubmVjdCgpe2lmKCEodGhpcy5yZWNvbm5lY3RBdHRlbXB0cz4wKSlyZXR1cm4gbmV3IFByb21pc2UoKChlLHQpPT57dGhpcy5wZW5kaW5nQ29ubmVjdHMucHVzaCh7cmVzb2x2ZTplLHJlamVjdDp0fSksdGhpcy5wZW5kaW5nQ29ubmVjdHMubGVuZ3RoPjF8fHRoaXMuaW5pdENvbm5lY3QoKX0pKX1pbml0Q29ubmVjdCgpe3RoaXMuZGlzY29ubmVjdCghMCksY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVvdXRJZCksdGhpcy5jb25uZWN0VGltZW91dElkPXNldFRpbWVvdXQoKCgpPT57dGhpcy5jb25uZWN0RXJyb3JIYW5kbGVyKG5ldyBFcnJvcihcIkV2ZW50U291cmNlIGNvbm5lY3QgdG9vayB0b28gbG9uZy5cIikpfSksdGhpcy5tYXhDb25uZWN0VGltZW91dCksdGhpcy5ldmVudFNvdXJjZT1uZXcgRXZlbnRTb3VyY2UodGhpcy5jbGllbnQuYnVpbGRVcmwoXCIvYXBpL3JlYWx0aW1lXCIpKSx0aGlzLmV2ZW50U291cmNlLm9uZXJyb3I9ZT0+e3RoaXMuY29ubmVjdEVycm9ySGFuZGxlcihuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXN0YWJsaXNoIHJlYWx0aW1lIGNvbm5lY3Rpb24uXCIpKX0sdGhpcy5ldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiUEJfQ09OTkVDVFwiLChlPT57Y29uc3QgdD1lO3RoaXMuY2xpZW50SWQ9dD8ubGFzdEV2ZW50SWQsdGhpcy5zdWJtaXRTdWJzY3JpcHRpb25zKCkudGhlbigoYXN5bmMoKT0+e2xldCBlPTM7Zm9yKDt0aGlzLmhhc1Vuc2VudFN1YnNjcmlwdGlvbnMoKSYmZT4wOyllLS0sYXdhaXQgdGhpcy5zdWJtaXRTdWJzY3JpcHRpb25zKCl9KSkudGhlbigoKCk9Pntmb3IobGV0IGUgb2YgdGhpcy5wZW5kaW5nQ29ubmVjdHMpZS5yZXNvbHZlKCk7dGhpcy5wZW5kaW5nQ29ubmVjdHM9W10sdGhpcy5yZWNvbm5lY3RBdHRlbXB0cz0wLGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVvdXRJZCksY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVvdXRJZCk7Y29uc3QgdD10aGlzLmdldFN1YnNjcmlwdGlvbnNCeVRvcGljKFwiUEJfQ09OTkVDVFwiKTtmb3IobGV0IHMgaW4gdClmb3IobGV0IGkgb2YgdFtzXSlpKGUpfSkpLmNhdGNoKChlPT57dGhpcy5jbGllbnRJZD1cIlwiLHRoaXMuY29ubmVjdEVycm9ySGFuZGxlcihlKX0pKX0pKX1oYXNVbnNlbnRTdWJzY3JpcHRpb25zKCl7Y29uc3QgZT10aGlzLmdldE5vbkVtcHR5U3Vic2NyaXB0aW9uS2V5cygpO2lmKGUubGVuZ3RoIT10aGlzLmxhc3RTZW50U3Vic2NyaXB0aW9ucy5sZW5ndGgpcmV0dXJuITA7Zm9yKGNvbnN0IHQgb2YgZSlpZighdGhpcy5sYXN0U2VudFN1YnNjcmlwdGlvbnMuaW5jbHVkZXModCkpcmV0dXJuITA7cmV0dXJuITF9Y29ubmVjdEVycm9ySGFuZGxlcihlKXtpZihjbGVhclRpbWVvdXQodGhpcy5jb25uZWN0VGltZW91dElkKSxjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lb3V0SWQpLCF0aGlzLmNsaWVudElkJiYhdGhpcy5yZWNvbm5lY3RBdHRlbXB0c3x8dGhpcy5yZWNvbm5lY3RBdHRlbXB0cz50aGlzLm1heFJlY29ubmVjdEF0dGVtcHRzKXtmb3IobGV0IHQgb2YgdGhpcy5wZW5kaW5nQ29ubmVjdHMpdC5yZWplY3QobmV3IENsaWVudFJlc3BvbnNlRXJyb3IoZSkpO3JldHVybiB0aGlzLnBlbmRpbmdDb25uZWN0cz1bXSx2b2lkIHRoaXMuZGlzY29ubmVjdCgpfXRoaXMuZGlzY29ubmVjdCghMCk7Y29uc3QgdD10aGlzLnByZWRlZmluZWRSZWNvbm5lY3RJbnRlcnZhbHNbdGhpcy5yZWNvbm5lY3RBdHRlbXB0c118fHRoaXMucHJlZGVmaW5lZFJlY29ubmVjdEludGVydmFsc1t0aGlzLnByZWRlZmluZWRSZWNvbm5lY3RJbnRlcnZhbHMubGVuZ3RoLTFdO3RoaXMucmVjb25uZWN0QXR0ZW1wdHMrKyx0aGlzLnJlY29ubmVjdFRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuaW5pdENvbm5lY3QoKX0pLHQpfWRpc2Nvbm5lY3QoZT0hMSl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVvdXRJZCksY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZW91dElkKSx0aGlzLnJlbW92ZUFsbFN1YnNjcmlwdGlvbkxpc3RlbmVycygpLHRoaXMuY2xpZW50LmNhbmNlbFJlcXVlc3QodGhpcy5nZXRTdWJzY3JpcHRpb25zQ2FuY2VsS2V5KCkpLHRoaXMuZXZlbnRTb3VyY2U/LmNsb3NlKCksdGhpcy5ldmVudFNvdXJjZT1udWxsLHRoaXMuY2xpZW50SWQ9XCJcIiwhZSl7dGhpcy5yZWNvbm5lY3RBdHRlbXB0cz0wO2ZvcihsZXQgZSBvZiB0aGlzLnBlbmRpbmdDb25uZWN0cyllLnJlc29sdmUoKTt0aGlzLnBlbmRpbmdDb25uZWN0cz1bXX19fWNsYXNzIFJlY29yZFNlcnZpY2UgZXh0ZW5kcyBDcnVkU2VydmljZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpLHRoaXMuY29sbGVjdGlvbklkT3JOYW1lPXR9Z2V0IGJhc2VDcnVkUGF0aCgpe3JldHVybiB0aGlzLmJhc2VDb2xsZWN0aW9uUGF0aCtcIi9yZWNvcmRzXCJ9Z2V0IGJhc2VDb2xsZWN0aW9uUGF0aCgpe3JldHVyblwiL2FwaS9jb2xsZWN0aW9ucy9cIitlbmNvZGVVUklDb21wb25lbnQodGhpcy5jb2xsZWN0aW9uSWRPck5hbWUpfWFzeW5jIHN1YnNjcmliZShlLHQscyl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyB0b3BpYy5cIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBzdWJzY3JpcHRpb24gY2FsbGJhY2suXCIpO3JldHVybiB0aGlzLmNsaWVudC5yZWFsdGltZS5zdWJzY3JpYmUodGhpcy5jb2xsZWN0aW9uSWRPck5hbWUrXCIvXCIrZSx0LHMpfWFzeW5jIHVuc3Vic2NyaWJlKGUpe3JldHVybiBlP3RoaXMuY2xpZW50LnJlYWx0aW1lLnVuc3Vic2NyaWJlKHRoaXMuY29sbGVjdGlvbklkT3JOYW1lK1wiL1wiK2UpOnRoaXMuY2xpZW50LnJlYWx0aW1lLnVuc3Vic2NyaWJlQnlQcmVmaXgodGhpcy5jb2xsZWN0aW9uSWRPck5hbWUpfWFzeW5jIGdldEZ1bGxMaXN0KGUsdCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpcmV0dXJuIHN1cGVyLmdldEZ1bGxMaXN0KGUsdCk7Y29uc3Qgcz1PYmplY3QuYXNzaWduKHt9LGUsdCk7cmV0dXJuIHN1cGVyLmdldEZ1bGxMaXN0KHMpfWFzeW5jIGdldExpc3QoZT0xLHQ9MzAscyl7cmV0dXJuIHN1cGVyLmdldExpc3QoZSx0LHMpfWFzeW5jIGdldEZpcnN0TGlzdEl0ZW0oZSx0KXtyZXR1cm4gc3VwZXIuZ2V0Rmlyc3RMaXN0SXRlbShlLHQpfWFzeW5jIGdldE9uZShlLHQpe3JldHVybiBzdXBlci5nZXRPbmUoZSx0KX1hc3luYyBjcmVhdGUoZSx0KXtyZXR1cm4gc3VwZXIuY3JlYXRlKGUsdCl9YXN5bmMgdXBkYXRlKGUsdCxzKXtyZXR1cm4gc3VwZXIudXBkYXRlKGUsdCxzKS50aGVuKChlPT4odGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsPy5pZCE9PWU/LmlkfHx0aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmNvbGxlY3Rpb25JZCE9PXRoaXMuY29sbGVjdGlvbklkT3JOYW1lJiZ0aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmNvbGxlY3Rpb25OYW1lIT09dGhpcy5jb2xsZWN0aW9uSWRPck5hbWV8fHRoaXMuY2xpZW50LmF1dGhTdG9yZS5zYXZlKHRoaXMuY2xpZW50LmF1dGhTdG9yZS50b2tlbixlKSxlKSkpfWFzeW5jIGRlbGV0ZShlLHQpe3JldHVybiBzdXBlci5kZWxldGUoZSx0KS50aGVuKCh0PT4oIXR8fHRoaXMuY2xpZW50LmF1dGhTdG9yZS5tb2RlbD8uaWQhPT1lfHx0aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmNvbGxlY3Rpb25JZCE9PXRoaXMuY29sbGVjdGlvbklkT3JOYW1lJiZ0aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmNvbGxlY3Rpb25OYW1lIT09dGhpcy5jb2xsZWN0aW9uSWRPck5hbWV8fHRoaXMuY2xpZW50LmF1dGhTdG9yZS5jbGVhcigpLHQpKSl9YXV0aFJlc3BvbnNlKGUpe2NvbnN0IHQ9dGhpcy5kZWNvZGUoZT8ucmVjb3JkfHx7fSk7cmV0dXJuIHRoaXMuY2xpZW50LmF1dGhTdG9yZS5zYXZlKGU/LnRva2VuLHQpLE9iamVjdC5hc3NpZ24oe30sZSx7dG9rZW46ZT8udG9rZW58fFwiXCIscmVjb3JkOnR9KX1hc3luYyBsaXN0QXV0aE1ldGhvZHMoZSl7cmV0dXJuIGU9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiR0VUXCJ9LGUpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvYXV0aC1tZXRob2RzXCIsZSkudGhlbigoZT0+T2JqZWN0LmFzc2lnbih7fSxlLHt1c2VybmFtZVBhc3N3b3JkOiEhZT8udXNlcm5hbWVQYXNzd29yZCxlbWFpbFBhc3N3b3JkOiEhZT8uZW1haWxQYXNzd29yZCxhdXRoUHJvdmlkZXJzOkFycmF5LmlzQXJyYXkoZT8uYXV0aFByb3ZpZGVycyk/ZT8uYXV0aFByb3ZpZGVyczpbXX0pKSl9YXN5bmMgYXV0aFdpdGhQYXNzd29yZChlLHQscyxpKXtsZXQgbj17bWV0aG9kOlwiUE9TVFwiLGJvZHk6e2lkZW50aXR5OmUscGFzc3dvcmQ6dH19O3JldHVybiBuPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIGF1dGhXaXRoUGFzc3dvcmQodXNlcm5hbWVPckVtYWlsLCBwYXNzLCBib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCBhdXRoV2l0aFBhc3N3b3JkKHVzZXJuYW1lT3JFbWFpbCwgcGFzcywgb3B0aW9ucz8pLlwiLG4scyxpKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNvbGxlY3Rpb25QYXRoK1wiL2F1dGgtd2l0aC1wYXNzd29yZFwiLG4pLnRoZW4oKGU9PnRoaXMuYXV0aFJlc3BvbnNlKGUpKSl9YXN5bmMgYXV0aFdpdGhPQXV0aDJDb2RlKGUsdCxzLGksbixyLG8pe2xldCBhPXttZXRob2Q6XCJQT1NUXCIsYm9keTp7cHJvdmlkZXI6ZSxjb2RlOnQsY29kZVZlcmlmaWVyOnMscmVkaXJlY3RVcmw6aSxjcmVhdGVEYXRhOm59fTtyZXR1cm4gYT1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiBhdXRoV2l0aE9BdXRoMkNvZGUocHJvdmlkZXIsIGNvZGUsIGNvZGVWZXJpZmllciwgcmVkaXJlY3RVcmwsIGNyZWF0ZURhdGE/LCBib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCBhdXRoV2l0aE9BdXRoMkNvZGUocHJvdmlkZXIsIGNvZGUsIGNvZGVWZXJpZmllciwgcmVkaXJlY3RVcmwsIGNyZWF0ZURhdGE/LCBvcHRpb25zPykuXCIsYSxyLG8pLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvYXV0aC13aXRoLW9hdXRoMlwiLGEpLnRoZW4oKGU9PnRoaXMuYXV0aFJlc3BvbnNlKGUpKSl9YXV0aFdpdGhPQXV0aDIoLi4uZSl7aWYoZS5sZW5ndGg+MXx8XCJzdHJpbmdcIj09dHlwZW9mIGU/LlswXSlyZXR1cm4gY29uc29sZS53YXJuKFwiUG9ja2V0QmFzZTogVGhpcyBmb3JtIG9mIGF1dGhXaXRoT0F1dGgyKCkgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGdldCByZW1vdmVkIGluIHRoZSBmdXR1cmUuIFBsZWFzZSByZXBsYWNlIHdpdGggYXV0aFdpdGhPQXV0aDJDb2RlKCkgT1IgdXNlIHRoZSBhdXRoV2l0aE9BdXRoMigpIHJlYWx0aW1lIGZvcm0gYXMgc2hvd24gaW4gaHR0cHM6Ly9wb2NrZXRiYXNlLmlvL2RvY3MvYXV0aGVudGljYXRpb24vI29hdXRoMi1pbnRlZ3JhdGlvbi5cIiksdGhpcy5hdXRoV2l0aE9BdXRoMkNvZGUoZT8uWzBdfHxcIlwiLGU/LlsxXXx8XCJcIixlPy5bMl18fFwiXCIsZT8uWzNdfHxcIlwiLGU/Lls0XXx8e30sZT8uWzVdfHx7fSxlPy5bNl18fHt9KTtjb25zdCB0PWU/LlswXXx8e307bGV0IHM9bnVsbDt0LnVybENhbGxiYWNrfHwocz1vcGVuQnJvd3NlclBvcHVwKHZvaWQgMCkpO2NvbnN0IGk9bmV3IFJlYWx0aW1lU2VydmljZSh0aGlzLmNsaWVudCk7ZnVuY3Rpb24gY2xlYW51cCgpe3M/LmNsb3NlKCksaS51bnN1YnNjcmliZSgpfWNvbnN0IG49e30scj10LnJlcXVlc3RLZXk7cmV0dXJuIHImJihuLnJlcXVlc3RLZXk9ciksdGhpcy5saXN0QXV0aE1ldGhvZHMobikudGhlbigoZT0+e2NvbnN0IG49ZS5hdXRoUHJvdmlkZXJzLmZpbmQoKGU9PmUubmFtZT09PXQucHJvdmlkZXIpKTtpZighbil0aHJvdyBuZXcgQ2xpZW50UmVzcG9uc2VFcnJvcihuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBwcm92aWRlciBcIiR7dC5wcm92aWRlcn1cIi5gKSk7Y29uc3Qgbz10aGlzLmNsaWVudC5idWlsZFVybChcIi9hcGkvb2F1dGgyLXJlZGlyZWN0XCIpLGE9cj90aGlzLmNsaWVudC5jYW5jZWxDb250cm9sbGVycz8uW3JdOnZvaWQgMDtyZXR1cm4gYSYmKGEuc2lnbmFsLm9uYWJvcnQ9KCk9PntjbGVhbnVwKCl9KSxuZXcgUHJvbWlzZSgoYXN5bmMoZSxyKT0+e3RyeXthd2FpdCBpLnN1YnNjcmliZShcIkBvYXV0aDJcIiwoYXN5bmMgcz0+e2NvbnN0IGM9aS5jbGllbnRJZDt0cnl7aWYoIXMuc3RhdGV8fGMhPT1zLnN0YXRlKXRocm93IG5ldyBFcnJvcihcIlN0YXRlIHBhcmFtZXRlcnMgZG9uJ3QgbWF0Y2guXCIpO2lmKHMuZXJyb3J8fCFzLmNvZGUpdGhyb3cgbmV3IEVycm9yKFwiT0F1dGgyIHJlZGlyZWN0IGVycm9yIG9yIG1pc3NpbmcgY29kZTogXCIrcy5lcnJvcik7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LHQpO2RlbGV0ZSBpLnByb3ZpZGVyLGRlbGV0ZSBpLnNjb3BlcyxkZWxldGUgaS5jcmVhdGVEYXRhLGRlbGV0ZSBpLnVybENhbGxiYWNrLGE/LnNpZ25hbD8ub25hYm9ydCYmKGEuc2lnbmFsLm9uYWJvcnQ9bnVsbCk7Y29uc3Qgcj1hd2FpdCB0aGlzLmF1dGhXaXRoT0F1dGgyQ29kZShuLm5hbWUscy5jb2RlLG4uY29kZVZlcmlmaWVyLG8sdC5jcmVhdGVEYXRhLGkpO2Uocil9Y2F0Y2goZSl7cihuZXcgQ2xpZW50UmVzcG9uc2VFcnJvcihlKSl9Y2xlYW51cCgpfSkpO2NvbnN0IGM9e3N0YXRlOmkuY2xpZW50SWR9O3Quc2NvcGVzPy5sZW5ndGgmJihjLnNjb3BlPXQuc2NvcGVzLmpvaW4oXCIgXCIpKTtjb25zdCBsPXRoaXMuX3JlcGxhY2VRdWVyeVBhcmFtcyhuLmF1dGhVcmwrbyxjKTtsZXQgaD10LnVybENhbGxiYWNrfHxmdW5jdGlvbihlKXtzP3MubG9jYXRpb24uaHJlZj1lOnM9b3BlbkJyb3dzZXJQb3B1cChlKX07YXdhaXQgaChsKX1jYXRjaChlKXtjbGVhbnVwKCkscihuZXcgQ2xpZW50UmVzcG9uc2VFcnJvcihlKSl9fSkpfSkpLmNhdGNoKChlPT57dGhyb3cgY2xlYW51cCgpLGV9KSl9YXN5bmMgYXV0aFJlZnJlc2goZSx0KXtsZXQgcz17bWV0aG9kOlwiUE9TVFwifTtyZXR1cm4gcz1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiBhdXRoUmVmcmVzaChib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCBhdXRoUmVmcmVzaChvcHRpb25zPykuXCIscyxlLHQpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvYXV0aC1yZWZyZXNoXCIscykudGhlbigoZT0+dGhpcy5hdXRoUmVzcG9uc2UoZSkpKX1hc3luYyByZXF1ZXN0UGFzc3dvcmRSZXNldChlLHQscyl7bGV0IGk9e21ldGhvZDpcIlBPU1RcIixib2R5OntlbWFpbDplfX07cmV0dXJuIGk9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgcmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsLCBvcHRpb25zPykuXCIsaSx0LHMpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvcmVxdWVzdC1wYXNzd29yZC1yZXNldFwiLGkpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIGNvbmZpcm1QYXNzd29yZFJlc2V0KGUsdCxzLGksbil7bGV0IHI9e21ldGhvZDpcIlBPU1RcIixib2R5Ont0b2tlbjplLHBhc3N3b3JkOnQscGFzc3dvcmRDb25maXJtOnN9fTtyZXR1cm4gcj1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiBjb25maXJtUGFzc3dvcmRSZXNldCh0b2tlbiwgcGFzc3dvcmQsIHBhc3N3b3JkQ29uZmlybSwgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggY29uZmlybVBhc3N3b3JkUmVzZXQodG9rZW4sIHBhc3N3b3JkLCBwYXNzd29yZENvbmZpcm0sIG9wdGlvbnM/KS5cIixyLGksbiksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDb2xsZWN0aW9uUGF0aCtcIi9jb25maXJtLXBhc3N3b3JkLXJlc2V0XCIscikudGhlbigoKCk9PiEwKSl9YXN5bmMgcmVxdWVzdFZlcmlmaWNhdGlvbihlLHQscyl7bGV0IGk9e21ldGhvZDpcIlBPU1RcIixib2R5OntlbWFpbDplfX07cmV0dXJuIGk9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgcmVxdWVzdFZlcmlmaWNhdGlvbihlbWFpbCwgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggcmVxdWVzdFZlcmlmaWNhdGlvbihlbWFpbCwgb3B0aW9ucz8pLlwiLGksdCxzKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNvbGxlY3Rpb25QYXRoK1wiL3JlcXVlc3QtdmVyaWZpY2F0aW9uXCIsaSkudGhlbigoKCk9PiEwKSl9YXN5bmMgY29uZmlybVZlcmlmaWNhdGlvbihlLHQscyl7bGV0IGk9e21ldGhvZDpcIlBPU1RcIixib2R5Ont0b2tlbjplfX07cmV0dXJuIGk9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgY29uZmlybVZlcmlmaWNhdGlvbih0b2tlbiwgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggY29uZmlybVZlcmlmaWNhdGlvbih0b2tlbiwgb3B0aW9ucz8pLlwiLGksdCxzKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNvbGxlY3Rpb25QYXRoK1wiL2NvbmZpcm0tdmVyaWZpY2F0aW9uXCIsaSkudGhlbigoKCk9Pntjb25zdCB0PWdldFRva2VuUGF5bG9hZChlKSxzPXRoaXMuY2xpZW50LmF1dGhTdG9yZS5tb2RlbDtyZXR1cm4gcyYmIXMudmVyaWZpZWQmJnMuaWQ9PT10LmlkJiZzLmNvbGxlY3Rpb25JZD09PXQuY29sbGVjdGlvbklkJiYocy52ZXJpZmllZD0hMCx0aGlzLmNsaWVudC5hdXRoU3RvcmUuc2F2ZSh0aGlzLmNsaWVudC5hdXRoU3RvcmUudG9rZW4scykpLCEwfSkpfWFzeW5jIHJlcXVlc3RFbWFpbENoYW5nZShlLHQscyl7bGV0IGk9e21ldGhvZDpcIlBPU1RcIixib2R5OntuZXdFbWFpbDplfX07cmV0dXJuIGk9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgcmVxdWVzdEVtYWlsQ2hhbmdlKG5ld0VtYWlsLCBib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCByZXF1ZXN0RW1haWxDaGFuZ2UobmV3RW1haWwsIG9wdGlvbnM/KS5cIixpLHQscyksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDb2xsZWN0aW9uUGF0aCtcIi9yZXF1ZXN0LWVtYWlsLWNoYW5nZVwiLGkpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIGNvbmZpcm1FbWFpbENoYW5nZShlLHQscyxpKXtsZXQgbj17bWV0aG9kOlwiUE9TVFwiLGJvZHk6e3Rva2VuOmUscGFzc3dvcmQ6dH19O3JldHVybiBuPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIGNvbmZpcm1FbWFpbENoYW5nZSh0b2tlbiwgcGFzc3dvcmQsIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIGNvbmZpcm1FbWFpbENoYW5nZSh0b2tlbiwgcGFzc3dvcmQsIG9wdGlvbnM/KS5cIixuLHMsaSksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDb2xsZWN0aW9uUGF0aCtcIi9jb25maXJtLWVtYWlsLWNoYW5nZVwiLG4pLnRoZW4oKCgpPT57Y29uc3QgdD1nZXRUb2tlblBheWxvYWQoZSkscz10aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw7cmV0dXJuIHMmJnMuaWQ9PT10LmlkJiZzLmNvbGxlY3Rpb25JZD09PXQuY29sbGVjdGlvbklkJiZ0aGlzLmNsaWVudC5hdXRoU3RvcmUuY2xlYXIoKSwhMH0pKX1hc3luYyBsaXN0RXh0ZXJuYWxBdXRocyhlLHQpe3JldHVybiB0PU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkdFVFwifSx0KSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNydWRQYXRoK1wiL1wiK2VuY29kZVVSSUNvbXBvbmVudChlKStcIi9leHRlcm5hbC1hdXRoc1wiLHQpfWFzeW5jIHVubGlua0V4dGVybmFsQXV0aChlLHQscyl7cmV0dXJuIHM9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiREVMRVRFXCJ9LHMpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvXCIrZW5jb2RlVVJJQ29tcG9uZW50KGUpK1wiL2V4dGVybmFsLWF1dGhzL1wiK2VuY29kZVVSSUNvbXBvbmVudCh0KSxzKS50aGVuKCgoKT0+ITApKX1fcmVwbGFjZVF1ZXJ5UGFyYW1zKGUsdD17fSl7bGV0IHM9ZSxpPVwiXCI7ZS5pbmRleE9mKFwiP1wiKT49MCYmKHM9ZS5zdWJzdHJpbmcoMCxlLmluZGV4T2YoXCI/XCIpKSxpPWUuc3Vic3RyaW5nKGUuaW5kZXhPZihcIj9cIikrMSkpO2NvbnN0IG49e30scj1pLnNwbGl0KFwiJlwiKTtmb3IoY29uc3QgZSBvZiByKXtpZihcIlwiPT1lKWNvbnRpbnVlO2NvbnN0IHQ9ZS5zcGxpdChcIj1cIik7bltkZWNvZGVVUklDb21wb25lbnQodFswXS5yZXBsYWNlKC9cXCsvZyxcIiBcIikpXT1kZWNvZGVVUklDb21wb25lbnQoKHRbMV18fFwiXCIpLnJlcGxhY2UoL1xcKy9nLFwiIFwiKSl9Zm9yKGxldCBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmKG51bGw9PXRbZV0/ZGVsZXRlIG5bZV06bltlXT10W2VdKTtpPVwiXCI7Zm9yKGxldCBlIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShlKSYmKFwiXCIhPWkmJihpKz1cIiZcIiksaSs9ZW5jb2RlVVJJQ29tcG9uZW50KGUucmVwbGFjZSgvJTIwL2csXCIrXCIpKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQobltlXS5yZXBsYWNlKC8lMjAvZyxcIitcIikpKTtyZXR1cm5cIlwiIT1pP3MrXCI/XCIraTpzfX1mdW5jdGlvbiBvcGVuQnJvd3NlclBvcHVwKGUpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3d8fCF3aW5kb3c/Lm9wZW4pdGhyb3cgbmV3IENsaWVudFJlc3BvbnNlRXJyb3IobmV3IEVycm9yKFwiTm90IGluIGEgYnJvd3NlciBjb250ZXh0IC0gcGxlYXNlIHBhc3MgYSBjdXN0b20gdXJsQ2FsbGJhY2sgZnVuY3Rpb24uXCIpKTtsZXQgdD0xMDI0LHM9NzY4LGk9d2luZG93LmlubmVyV2lkdGgsbj13aW5kb3cuaW5uZXJIZWlnaHQ7dD10Pmk/aTp0LHM9cz5uP246cztsZXQgcj1pLzItdC8yLG89bi8yLXMvMjtyZXR1cm4gd2luZG93Lm9wZW4oZSxcInBvcHVwX3dpbmRvd1wiLFwid2lkdGg9XCIrdCtcIixoZWlnaHQ9XCIrcytcIix0b3A9XCIrbytcIixsZWZ0PVwiK3IrXCIscmVzaXphYmxlLG1lbnViYXI9bm9cIil9Y2xhc3MgQ29sbGVjdGlvblNlcnZpY2UgZXh0ZW5kcyBDcnVkU2VydmljZXtnZXQgYmFzZUNydWRQYXRoKCl7cmV0dXJuXCIvYXBpL2NvbGxlY3Rpb25zXCJ9YXN5bmMgaW1wb3J0KGUsdD0hMSxzKXtyZXR1cm4gcz1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQVVRcIixib2R5Ontjb2xsZWN0aW9uczplLGRlbGV0ZU1pc3Npbmc6dH19LHMpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvaW1wb3J0XCIscykudGhlbigoKCk9PiEwKSl9fWNsYXNzIExvZ1NlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZXthc3luYyBnZXRMaXN0KGU9MSx0PTMwLHMpe3JldHVybihzPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkdFVFwifSxzKSkucXVlcnk9T2JqZWN0LmFzc2lnbih7cGFnZTplLHBlclBhZ2U6dH0scy5xdWVyeSksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvbG9nc1wiLHMpfWFzeW5jIGdldE9uZShlLHQpe2lmKCFlKXRocm93IG5ldyBDbGllbnRSZXNwb25zZUVycm9yKHt1cmw6dGhpcy5jbGllbnQuYnVpbGRVcmwoXCIvYXBpL2xvZ3MvXCIpLHN0YXR1czo0MDQscmVzcG9uc2U6e2NvZGU6NDA0LG1lc3NhZ2U6XCJNaXNzaW5nIHJlcXVpcmVkIGxvZyBpZC5cIixkYXRhOnt9fX0pO3JldHVybiB0PU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkdFVFwifSx0KSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9sb2dzL1wiK2VuY29kZVVSSUNvbXBvbmVudChlKSx0KX1hc3luYyBnZXRTdGF0cyhlKXtyZXR1cm4gZT1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0sZSksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvbG9ncy9zdGF0c1wiLGUpfX1jbGFzcyBIZWFsdGhTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2V7YXN5bmMgY2hlY2soZSl7cmV0dXJuIGU9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiR0VUXCJ9LGUpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL2hlYWx0aFwiLGUpfX1jbGFzcyBGaWxlU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNle2dldFVybChlLHQscz17fSl7aWYoIXR8fCFlPy5pZHx8IWU/LmNvbGxlY3Rpb25JZCYmIWU/LmNvbGxlY3Rpb25OYW1lKXJldHVyblwiXCI7Y29uc3QgaT1bXTtpLnB1c2goXCJhcGlcIiksaS5wdXNoKFwiZmlsZXNcIiksaS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChlLmNvbGxlY3Rpb25JZHx8ZS5jb2xsZWN0aW9uTmFtZSkpLGkucHVzaChlbmNvZGVVUklDb21wb25lbnQoZS5pZCkpLGkucHVzaChlbmNvZGVVUklDb21wb25lbnQodCkpO2xldCBuPXRoaXMuY2xpZW50LmJ1aWxkVXJsKGkuam9pbihcIi9cIikpO2lmKE9iamVjdC5rZXlzKHMpLmxlbmd0aCl7ITE9PT1zLmRvd25sb2FkJiZkZWxldGUgcy5kb3dubG9hZDtjb25zdCBlPW5ldyBVUkxTZWFyY2hQYXJhbXMocyk7bis9KG4uaW5jbHVkZXMoXCI/XCIpP1wiJlwiOlwiP1wiKStlfXJldHVybiBufWFzeW5jIGdldFRva2VuKGUpe3JldHVybiBlPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIlBPU1RcIn0sZSksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvZmlsZXMvdG9rZW5cIixlKS50aGVuKChlPT5lPy50b2tlbnx8XCJcIikpfX1jbGFzcyBCYWNrdXBTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2V7YXN5bmMgZ2V0RnVsbExpc3QoZSl7cmV0dXJuIGU9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiR0VUXCJ9LGUpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL2JhY2t1cHNcIixlKX1hc3luYyBjcmVhdGUoZSx0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCIsYm9keTp7bmFtZTplfX0sdCksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvYmFja3Vwc1wiLHQpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIHVwbG9hZChlLHQpe3JldHVybiB0PU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIlBPU1RcIixib2R5OmV9LHQpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL2JhY2t1cHMvdXBsb2FkXCIsdCkudGhlbigoKCk9PiEwKSl9YXN5bmMgZGVsZXRlKGUsdCl7cmV0dXJuIHQ9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiREVMRVRFXCJ9LHQpLHRoaXMuY2xpZW50LnNlbmQoYC9hcGkvYmFja3Vwcy8ke2VuY29kZVVSSUNvbXBvbmVudChlKX1gLHQpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIHJlc3RvcmUoZSx0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCJ9LHQpLHRoaXMuY2xpZW50LnNlbmQoYC9hcGkvYmFja3Vwcy8ke2VuY29kZVVSSUNvbXBvbmVudChlKX0vcmVzdG9yZWAsdCkudGhlbigoKCk9PiEwKSl9Z2V0RG93bmxvYWRVcmwoZSx0KXtyZXR1cm4gdGhpcy5jbGllbnQuYnVpbGRVcmwoYC9hcGkvYmFja3Vwcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0KX0/dG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQoZSl9YCl9fWNsYXNzIENsaWVudHtjb25zdHJ1Y3RvcihlPVwiL1wiLHQscz1cImVuLVVTXCIpe3RoaXMuY2FuY2VsQ29udHJvbGxlcnM9e30sdGhpcy5yZWNvcmRTZXJ2aWNlcz17fSx0aGlzLmVuYWJsZUF1dG9DYW5jZWxsYXRpb249ITAsdGhpcy5iYXNlVXJsPWUsdGhpcy5sYW5nPXMsdGhpcy5hdXRoU3RvcmU9dHx8bmV3IExvY2FsQXV0aFN0b3JlLHRoaXMuYWRtaW5zPW5ldyBBZG1pblNlcnZpY2UodGhpcyksdGhpcy5jb2xsZWN0aW9ucz1uZXcgQ29sbGVjdGlvblNlcnZpY2UodGhpcyksdGhpcy5maWxlcz1uZXcgRmlsZVNlcnZpY2UodGhpcyksdGhpcy5sb2dzPW5ldyBMb2dTZXJ2aWNlKHRoaXMpLHRoaXMuc2V0dGluZ3M9bmV3IFNldHRpbmdzU2VydmljZSh0aGlzKSx0aGlzLnJlYWx0aW1lPW5ldyBSZWFsdGltZVNlcnZpY2UodGhpcyksdGhpcy5oZWFsdGg9bmV3IEhlYWx0aFNlcnZpY2UodGhpcyksdGhpcy5iYWNrdXBzPW5ldyBCYWNrdXBTZXJ2aWNlKHRoaXMpfWNvbGxlY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjb3JkU2VydmljZXNbZV18fCh0aGlzLnJlY29yZFNlcnZpY2VzW2VdPW5ldyBSZWNvcmRTZXJ2aWNlKHRoaXMsZSkpLHRoaXMucmVjb3JkU2VydmljZXNbZV19YXV0b0NhbmNlbGxhdGlvbihlKXtyZXR1cm4gdGhpcy5lbmFibGVBdXRvQ2FuY2VsbGF0aW9uPSEhZSx0aGlzfWNhbmNlbFJlcXVlc3QoZSl7cmV0dXJuIHRoaXMuY2FuY2VsQ29udHJvbGxlcnNbZV0mJih0aGlzLmNhbmNlbENvbnRyb2xsZXJzW2VdLmFib3J0KCksZGVsZXRlIHRoaXMuY2FuY2VsQ29udHJvbGxlcnNbZV0pLHRoaXN9Y2FuY2VsQWxsUmVxdWVzdHMoKXtmb3IobGV0IGUgaW4gdGhpcy5jYW5jZWxDb250cm9sbGVycyl0aGlzLmNhbmNlbENvbnRyb2xsZXJzW2VdLmFib3J0KCk7cmV0dXJuIHRoaXMuY2FuY2VsQ29udHJvbGxlcnM9e30sdGhpc31maWx0ZXIoZSx0KXtpZighdClyZXR1cm4gZTtmb3IobGV0IHMgaW4gdCl7bGV0IGk9dFtzXTtzd2l0Y2godHlwZW9mIGkpe2Nhc2VcImJvb2xlYW5cIjpjYXNlXCJudW1iZXJcIjppPVwiXCIraTticmVhaztjYXNlXCJzdHJpbmdcIjppPVwiJ1wiK2kucmVwbGFjZSgvJy9nLFwiXFxcXCdcIikrXCInXCI7YnJlYWs7ZGVmYXVsdDppPW51bGw9PT1pP1wibnVsbFwiOmkgaW5zdGFuY2VvZiBEYXRlP1wiJ1wiK2kudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiVFwiLFwiIFwiKStcIidcIjpcIidcIitKU09OLnN0cmluZ2lmeShpKS5yZXBsYWNlKC8nL2csXCJcXFxcJ1wiKStcIidcIn1lPWUucmVwbGFjZUFsbChcIns6XCIrcytcIn1cIixpKX1yZXR1cm4gZX1nZXRGaWxlVXJsKGUsdCxzPXt9KXtyZXR1cm4gdGhpcy5maWxlcy5nZXRVcmwoZSx0LHMpfWJ1aWxkVXJsKGUpe2xldCB0PXRoaXMuYmFzZVVybDtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwhd2luZG93LmxvY2F0aW9ufHx0LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKXx8dC5zdGFydHNXaXRoKFwiaHR0cDovL1wiKXx8KHQ9d2luZG93LmxvY2F0aW9uLm9yaWdpbj8uZW5kc1dpdGgoXCIvXCIpP3dpbmRvdy5sb2NhdGlvbi5vcmlnaW4uc3Vic3RyaW5nKDAsd2luZG93LmxvY2F0aW9uLm9yaWdpbi5sZW5ndGgtMSk6d2luZG93LmxvY2F0aW9uLm9yaWdpbnx8XCJcIix0aGlzLmJhc2VVcmwuc3RhcnRzV2l0aChcIi9cIil8fCh0Kz13aW5kb3cubG9jYXRpb24ucGF0aG5hbWV8fFwiL1wiLHQrPXQuZW5kc1dpdGgoXCIvXCIpP1wiXCI6XCIvXCIpLHQrPXRoaXMuYmFzZVVybCksZSYmKHQrPXQuZW5kc1dpdGgoXCIvXCIpP1wiXCI6XCIvXCIsdCs9ZS5zdGFydHNXaXRoKFwiL1wiKT9lLnN1YnN0cmluZygxKTplKSx0fWFzeW5jIHNlbmQoZSx0KXt0PXRoaXMuaW5pdFNlbmRPcHRpb25zKGUsdCk7bGV0IHM9dGhpcy5idWlsZFVybChlKTtpZih0aGlzLmJlZm9yZVNlbmQpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7fSxhd2FpdCB0aGlzLmJlZm9yZVNlbmQocyx0KSk7dm9pZCAwIT09ZS51cmx8fHZvaWQgMCE9PWUub3B0aW9ucz8ocz1lLnVybHx8cyx0PWUub3B0aW9uc3x8dCk6T2JqZWN0LmtleXMoZSkubGVuZ3RoJiYodD1lLGNvbnNvbGU/Lndhcm4mJmNvbnNvbGUud2FybihcIkRlcHJlY2F0ZWQgZm9ybWF0IG9mIGJlZm9yZVNlbmQgcmV0dXJuOiBwbGVhc2UgdXNlIGByZXR1cm4geyB1cmwsIG9wdGlvbnMgfWAsIGluc3RlYWQgb2YgYHJldHVybiBvcHRpb25zYC5cIikpfWlmKHZvaWQgMCE9PXQucXVlcnkpe2NvbnN0IGU9dGhpcy5zZXJpYWxpemVRdWVyeVBhcmFtcyh0LnF1ZXJ5KTtlJiYocys9KHMuaW5jbHVkZXMoXCI/XCIpP1wiJlwiOlwiP1wiKStlKSxkZWxldGUgdC5xdWVyeX1cImFwcGxpY2F0aW9uL2pzb25cIj09dGhpcy5nZXRIZWFkZXIodC5oZWFkZXJzLFwiQ29udGVudC1UeXBlXCIpJiZ0LmJvZHkmJlwic3RyaW5nXCIhPXR5cGVvZiB0LmJvZHkmJih0LmJvZHk9SlNPTi5zdHJpbmdpZnkodC5ib2R5KSk7cmV0dXJuKHQuZmV0Y2h8fGZldGNoKShzLHQpLnRoZW4oKGFzeW5jIGU9PntsZXQgdD17fTt0cnl7dD1hd2FpdCBlLmpzb24oKX1jYXRjaChlKXt9aWYodGhpcy5hZnRlclNlbmQmJih0PWF3YWl0IHRoaXMuYWZ0ZXJTZW5kKGUsdCkpLGUuc3RhdHVzPj00MDApdGhyb3cgbmV3IENsaWVudFJlc3BvbnNlRXJyb3Ioe3VybDplLnVybCxzdGF0dXM6ZS5zdGF0dXMsZGF0YTp0fSk7cmV0dXJuIHR9KSkuY2F0Y2goKGU9Pnt0aHJvdyBuZXcgQ2xpZW50UmVzcG9uc2VFcnJvcihlKX0pKX1pbml0U2VuZE9wdGlvbnMoZSx0KXtpZigodD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0sdCkpLmJvZHk9dGhpcy5jb252ZXJ0VG9Gb3JtRGF0YUlmTmVlZGVkKHQuYm9keSksbm9ybWFsaXplVW5rbm93blF1ZXJ5UGFyYW1zKHQpLHQucXVlcnk9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtcyx0LnF1ZXJ5KSx2b2lkIDA9PT10LnJlcXVlc3RLZXkmJighMT09PXQuJGF1dG9DYW5jZWx8fCExPT09dC5xdWVyeS4kYXV0b0NhbmNlbD90LnJlcXVlc3RLZXk9bnVsbDoodC4kY2FuY2VsS2V5fHx0LnF1ZXJ5LiRjYW5jZWxLZXkpJiYodC5yZXF1ZXN0S2V5PXQuJGNhbmNlbEtleXx8dC5xdWVyeS4kY2FuY2VsS2V5KSksZGVsZXRlIHQuJGF1dG9DYW5jZWwsZGVsZXRlIHQucXVlcnkuJGF1dG9DYW5jZWwsZGVsZXRlIHQuJGNhbmNlbEtleSxkZWxldGUgdC5xdWVyeS4kY2FuY2VsS2V5LG51bGwhPT10aGlzLmdldEhlYWRlcih0LmhlYWRlcnMsXCJDb250ZW50LVR5cGVcIil8fHRoaXMuaXNGb3JtRGF0YSh0LmJvZHkpfHwodC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzLHtcIkNvbnRlbnQtVHlwZVwiOlwiYXBwbGljYXRpb24vanNvblwifSkpLG51bGw9PT10aGlzLmdldEhlYWRlcih0LmhlYWRlcnMsXCJBY2NlcHQtTGFuZ3VhZ2VcIikmJih0LmhlYWRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMse1wiQWNjZXB0LUxhbmd1YWdlXCI6dGhpcy5sYW5nfSkpLHRoaXMuYXV0aFN0b3JlLnRva2VuJiZudWxsPT09dGhpcy5nZXRIZWFkZXIodC5oZWFkZXJzLFwiQXV0aG9yaXphdGlvblwiKSYmKHQuaGVhZGVycz1PYmplY3QuYXNzaWduKHt9LHQuaGVhZGVycyx7QXV0aG9yaXphdGlvbjp0aGlzLmF1dGhTdG9yZS50b2tlbn0pKSx0aGlzLmVuYWJsZUF1dG9DYW5jZWxsYXRpb24mJm51bGwhPT10LnJlcXVlc3RLZXkpe2NvbnN0IHM9dC5yZXF1ZXN0S2V5fHwodC5tZXRob2R8fFwiR0VUXCIpK2U7ZGVsZXRlIHQucmVxdWVzdEtleSx0aGlzLmNhbmNlbFJlcXVlc3Qocyk7Y29uc3QgaT1uZXcgQWJvcnRDb250cm9sbGVyO3RoaXMuY2FuY2VsQ29udHJvbGxlcnNbc109aSx0LnNpZ25hbD1pLnNpZ25hbH1yZXR1cm4gdH1jb252ZXJ0VG9Gb3JtRGF0YUlmTmVlZGVkKGUpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBGb3JtRGF0YXx8dm9pZCAwPT09ZXx8XCJvYmplY3RcIiE9dHlwZW9mIGV8fG51bGw9PT1lfHx0aGlzLmlzRm9ybURhdGEoZSl8fCF0aGlzLmhhc0Jsb2JGaWVsZChlKSlyZXR1cm4gZTtjb25zdCB0PW5ldyBGb3JtRGF0YTtmb3IoY29uc3QgcyBpbiBlKXtjb25zdCBpPWVbc107aWYoXCJvYmplY3RcIiE9dHlwZW9mIGl8fHRoaXMuaGFzQmxvYkZpZWxkKHtkYXRhOml9KSl7Y29uc3QgZT1BcnJheS5pc0FycmF5KGkpP2k6W2ldO2ZvcihsZXQgaSBvZiBlKXQuYXBwZW5kKHMsaSl9ZWxzZXtsZXQgZT17fTtlW3NdPWksdC5hcHBlbmQoXCJAanNvblBheWxvYWRcIixKU09OLnN0cmluZ2lmeShlKSl9fXJldHVybiB0fWhhc0Jsb2JGaWVsZChlKXtmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBzPUFycmF5LmlzQXJyYXkoZVt0XSk/ZVt0XTpbZVt0XV07Zm9yKGNvbnN0IGUgb2YgcylpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgQmxvYiYmZSBpbnN0YW5jZW9mIEJsb2J8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiBGaWxlJiZlIGluc3RhbmNlb2YgRmlsZSlyZXR1cm4hMH1yZXR1cm4hMX1nZXRIZWFkZXIoZSx0KXtlPWV8fHt9LHQ9dC50b0xvd2VyQ2FzZSgpO2ZvcihsZXQgcyBpbiBlKWlmKHMudG9Mb3dlckNhc2UoKT09dClyZXR1cm4gZVtzXTtyZXR1cm4gbnVsbH1pc0Zvcm1EYXRhKGUpe3JldHVybiBlJiYoXCJGb3JtRGF0YVwiPT09ZS5jb25zdHJ1Y3Rvci5uYW1lfHxcInVuZGVmaW5lZFwiIT10eXBlb2YgRm9ybURhdGEmJmUgaW5zdGFuY2VvZiBGb3JtRGF0YSl9c2VyaWFsaXplUXVlcnlQYXJhbXMoZSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgcyBpbiBlKXtpZihudWxsPT09ZVtzXSljb250aW51ZTtjb25zdCBpPWVbc10sbj1lbmNvZGVVUklDb21wb25lbnQocyk7aWYoQXJyYXkuaXNBcnJheShpKSlmb3IoY29uc3QgZSBvZiBpKXQucHVzaChuK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChlKSk7ZWxzZSBpIGluc3RhbmNlb2YgRGF0ZT90LnB1c2gobitcIj1cIitlbmNvZGVVUklDb21wb25lbnQoaS50b0lTT1N0cmluZygpKSk6bnVsbCE9PXR5cGVvZiBpJiZcIm9iamVjdFwiPT10eXBlb2YgaT90LnB1c2gobitcIj1cIitlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoaSkpKTp0LnB1c2gobitcIj1cIitlbmNvZGVVUklDb21wb25lbnQoaSkpfXJldHVybiB0LmpvaW4oXCImXCIpfX1jbGFzcyBBc3luY0F1dGhTdG9yZSBleHRlbmRzIEJhc2VBdXRoU3RvcmV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnF1ZXVlPVtdLHRoaXMuc2F2ZUZ1bmM9ZS5zYXZlLHRoaXMuY2xlYXJGdW5jPWUuY2xlYXIsdGhpcy5fZW5xdWV1ZSgoKCk9PnRoaXMuX2xvYWRJbml0aWFsKGUuaW5pdGlhbCkpKX1zYXZlKGUsdCl7c3VwZXIuc2F2ZShlLHQpO2xldCBzPVwiXCI7dHJ5e3M9SlNPTi5zdHJpbmdpZnkoe3Rva2VuOmUsbW9kZWw6dH0pfWNhdGNoKGUpe2NvbnNvbGUud2FybihcIkFzeW5jQXV0aFN0b3JlOiBmYWlsZWQgdG8gc3RyaW5naWZ5IHRoZSBuZXcgc3RhdGVcIil9dGhpcy5fZW5xdWV1ZSgoKCk9PnRoaXMuc2F2ZUZ1bmMocykpKX1jbGVhcigpe3N1cGVyLmNsZWFyKCksdGhpcy5jbGVhckZ1bmM/dGhpcy5fZW5xdWV1ZSgoKCk9PnRoaXMuY2xlYXJGdW5jKCkpKTp0aGlzLl9lbnF1ZXVlKCgoKT0+dGhpcy5zYXZlRnVuYyhcIlwiKSkpfWFzeW5jIF9sb2FkSW5pdGlhbChlKXt0cnl7aWYoZT1hd2FpdCBlKXtsZXQgdDtcInN0cmluZ1wiPT10eXBlb2YgZT90PUpTT04ucGFyc2UoZSl8fHt9Olwib2JqZWN0XCI9PXR5cGVvZiBlJiYodD1lKSx0aGlzLnNhdmUodC50b2tlbnx8XCJcIix0Lm1vZGVsfHxudWxsKX19Y2F0Y2goZSl7fX1fZW5xdWV1ZShlKXt0aGlzLnF1ZXVlLnB1c2goZSksMT09dGhpcy5xdWV1ZS5sZW5ndGgmJnRoaXMuX2RlcXVldWUoKX1fZGVxdWV1ZSgpe3RoaXMucXVldWUubGVuZ3RoJiZ0aGlzLnF1ZXVlWzBdKCkuZmluYWxseSgoKCk9Pnt0aGlzLnF1ZXVlLnNoaWZ0KCksdGhpcy5xdWV1ZS5sZW5ndGgmJnRoaXMuX2RlcXVldWUoKX0pKX19ZXhwb3J0e0FkbWluU2VydmljZSxBc3luY0F1dGhTdG9yZSxCYXNlQXV0aFN0b3JlLENsaWVudFJlc3BvbnNlRXJyb3IsQ29sbGVjdGlvblNlcnZpY2UsQ3J1ZFNlcnZpY2UsSGVhbHRoU2VydmljZSxMb2NhbEF1dGhTdG9yZSxMb2dTZXJ2aWNlLFJlYWx0aW1lU2VydmljZSxSZWNvcmRTZXJ2aWNlLGNvb2tpZVBhcnNlLGNvb2tpZVNlcmlhbGl6ZSxDbGllbnQgYXMgZGVmYXVsdCxnZXRUb2tlblBheWxvYWQsaXNUb2tlbkV4cGlyZWQsbm9ybWFsaXplVW5rbm93blF1ZXJ5UGFyYW1zfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvY2tldGJhc2UuZXMubWpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/pocketbase/dist/pocketbase.es.mjs\n");
/***/ })
};
;