/ components / FeedbackSurvey / usePostCompactSurvey.tsx
usePostCompactSurvey.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
  3  import { isFeedbackSurveyDisabled } from 'src/services/analytics/config.js';
  4  import { checkStatsigFeatureGate_CACHED_MAY_BE_STALE } from 'src/services/analytics/growthbook.js';
  5  import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from 'src/services/analytics/index.js';
  6  import { shouldUseSessionMemoryCompaction } from '../../services/compact/sessionMemoryCompact.js';
  7  import type { Message } from '../../types/message.js';
  8  import { isEnvTruthy } from '../../utils/envUtils.js';
  9  import { isCompactBoundaryMessage } from '../../utils/messages.js';
 10  import { logOTelEvent } from '../../utils/telemetry/events.js';
 11  import { useSurveyState } from './useSurveyState.js';
 12  import type { FeedbackSurveyResponse } from './utils.js';
 13  const HIDE_THANKS_AFTER_MS = 3000;
 14  const POST_COMPACT_SURVEY_GATE = 'tengu_post_compact_survey';
 15  const SURVEY_PROBABILITY = 0.2; // Show survey 20% of the time after compaction
 16  
 17  function hasMessageAfterBoundary(messages: Message[], boundaryUuid: string): boolean {
 18    const boundaryIndex = messages.findIndex(msg => msg.uuid === boundaryUuid);
 19    if (boundaryIndex === -1) {
 20      return false;
 21    }
 22  
 23    // Check if there's a user or assistant message after the boundary
 24    for (let i = boundaryIndex + 1; i < messages.length; i++) {
 25      const msg = messages[i];
 26      if (msg && (msg.type === 'user' || msg.type === 'assistant')) {
 27        return true;
 28      }
 29    }
 30    return false;
 31  }
 32  export function usePostCompactSurvey(messages, isLoading, t0, t1) {
 33    const $ = _c(23);
 34    const hasActivePrompt = t0 === undefined ? false : t0;
 35    let t2;
 36    if ($[0] !== t1) {
 37      t2 = t1 === undefined ? {} : t1;
 38      $[0] = t1;
 39      $[1] = t2;
 40    } else {
 41      t2 = $[1];
 42    }
 43    const {
 44      enabled: t3
 45    } = t2;
 46    const enabled = t3 === undefined ? true : t3;
 47    const [gateEnabled, setGateEnabled] = useState(null);
 48    let t4;
 49    if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
 50      t4 = new Set();
 51      $[2] = t4;
 52    } else {
 53      t4 = $[2];
 54    }
 55    const seenCompactBoundaries = useRef(t4);
 56    const pendingCompactBoundaryUuid = useRef(null);
 57    const onOpen = _temp;
 58    const onSelect = _temp2;
 59    let t5;
 60    if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
 61      t5 = {
 62        hideThanksAfterMs: HIDE_THANKS_AFTER_MS,
 63        onOpen,
 64        onSelect
 65      };
 66      $[3] = t5;
 67    } else {
 68      t5 = $[3];
 69    }
 70    const {
 71      state,
 72      lastResponse,
 73      open,
 74      handleSelect
 75    } = useSurveyState(t5);
 76    let t6;
 77    let t7;
 78    if ($[4] !== enabled) {
 79      t6 = () => {
 80        if (!enabled) {
 81          return;
 82        }
 83        setGateEnabled(checkStatsigFeatureGate_CACHED_MAY_BE_STALE(POST_COMPACT_SURVEY_GATE));
 84      };
 85      t7 = [enabled];
 86      $[4] = enabled;
 87      $[5] = t6;
 88      $[6] = t7;
 89    } else {
 90      t6 = $[5];
 91      t7 = $[6];
 92    }
 93    useEffect(t6, t7);
 94    let t8;
 95    if ($[7] !== messages) {
 96      t8 = new Set(messages.filter(_temp3).map(_temp4));
 97      $[7] = messages;
 98      $[8] = t8;
 99    } else {
100      t8 = $[8];
101    }
102    const currentCompactBoundaries = t8;
103    let t10;
104    let t9;
105    if ($[9] !== currentCompactBoundaries || $[10] !== enabled || $[11] !== gateEnabled || $[12] !== hasActivePrompt || $[13] !== isLoading || $[14] !== messages || $[15] !== open || $[16] !== state) {
106      t9 = () => {
107        if (!enabled) {
108          return;
109        }
110        if (state !== "closed" || isLoading) {
111          return;
112        }
113        if (hasActivePrompt) {
114          return;
115        }
116        if (gateEnabled !== true) {
117          return;
118        }
119        if (isFeedbackSurveyDisabled()) {
120          return;
121        }
122        if (isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY)) {
123          return;
124        }
125        if (pendingCompactBoundaryUuid.current !== null) {
126          if (hasMessageAfterBoundary(messages, pendingCompactBoundaryUuid.current)) {
127            pendingCompactBoundaryUuid.current = null;
128            if (Math.random() < SURVEY_PROBABILITY) {
129              open();
130            }
131            return;
132          }
133        }
134        const newBoundaries = Array.from(currentCompactBoundaries).filter(uuid => !seenCompactBoundaries.current.has(uuid));
135        if (newBoundaries.length > 0) {
136          seenCompactBoundaries.current = new Set(currentCompactBoundaries);
137          pendingCompactBoundaryUuid.current = newBoundaries[newBoundaries.length - 1];
138        }
139      };
140      t10 = [enabled, currentCompactBoundaries, state, isLoading, hasActivePrompt, gateEnabled, messages, open];
141      $[9] = currentCompactBoundaries;
142      $[10] = enabled;
143      $[11] = gateEnabled;
144      $[12] = hasActivePrompt;
145      $[13] = isLoading;
146      $[14] = messages;
147      $[15] = open;
148      $[16] = state;
149      $[17] = t10;
150      $[18] = t9;
151    } else {
152      t10 = $[17];
153      t9 = $[18];
154    }
155    useEffect(t9, t10);
156    let t11;
157    if ($[19] !== handleSelect || $[20] !== lastResponse || $[21] !== state) {
158      t11 = {
159        state,
160        lastResponse,
161        handleSelect
162      };
163      $[19] = handleSelect;
164      $[20] = lastResponse;
165      $[21] = state;
166      $[22] = t11;
167    } else {
168      t11 = $[22];
169    }
170    return t11;
171  }
172  function _temp4(msg_0) {
173    return msg_0.uuid;
174  }
175  function _temp3(msg) {
176    return isCompactBoundaryMessage(msg);
177  }
178  function _temp2(appearanceId_0, selected) {
179    const smCompactionEnabled_0 = shouldUseSessionMemoryCompaction();
180    logEvent("tengu_post_compact_survey_event", {
181      event_type: "responded" as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
182      appearance_id: appearanceId_0 as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
183      response: selected as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
184      session_memory_compaction_enabled: smCompactionEnabled_0 as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
185    });
186    logOTelEvent("feedback_survey", {
187      event_type: "responded",
188      appearance_id: appearanceId_0,
189      response: selected,
190      survey_type: "post_compact"
191    });
192  }
193  function _temp(appearanceId) {
194    const smCompactionEnabled = shouldUseSessionMemoryCompaction();
195    logEvent("tengu_post_compact_survey_event", {
196      event_type: "appeared" as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
197      appearance_id: appearanceId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
198      session_memory_compaction_enabled: smCompactionEnabled as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
199    });
200    logOTelEvent("feedback_survey", {
201      event_type: "appeared",
202      appearance_id: appearanceId,
203      survey_type: "post_compact"
204    });
205  }
206  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImlzRmVlZGJhY2tTdXJ2ZXlEaXNhYmxlZCIsImNoZWNrU3RhdHNpZ0ZlYXR1cmVHYXRlX0NBQ0hFRF9NQVlfQkVfU1RBTEUiLCJBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTIiwibG9nRXZlbnQiLCJzaG91bGRVc2VTZXNzaW9uTWVtb3J5Q29tcGFjdGlvbiIsIk1lc3NhZ2UiLCJpc0VudlRydXRoeSIsImlzQ29tcGFjdEJvdW5kYXJ5TWVzc2FnZSIsImxvZ09UZWxFdmVudCIsInVzZVN1cnZleVN0YXRlIiwiRmVlZGJhY2tTdXJ2ZXlSZXNwb25zZSIsIkhJREVfVEhBTktTX0FGVEVSX01TIiwiUE9TVF9DT01QQUNUX1NVUlZFWV9HQVRFIiwiU1VSVkVZX1BST0JBQklMSVRZIiwiaGFzTWVzc2FnZUFmdGVyQm91bmRhcnkiLCJtZXNzYWdlcyIsImJvdW5kYXJ5VXVpZCIsImJvdW5kYXJ5SW5kZXgiLCJmaW5kSW5kZXgiLCJtc2ciLCJ1dWlkIiwiaSIsImxlbmd0aCIsInR5cGUiLCJ1c2VQb3N0Q29tcGFjdFN1cnZleSIsImlzTG9hZGluZyIsInQwIiwidDEiLCIkIiwiX2MiLCJoYXNBY3RpdmVQcm9tcHQiLCJ1bmRlZmluZWQiLCJ0MiIsImVuYWJsZWQiLCJ0MyIsImdhdGVFbmFibGVkIiwic2V0R2F0ZUVuYWJsZWQiLCJ0NCIsIlN5bWJvbCIsImZvciIsIlNldCIsInNlZW5Db21wYWN0Qm91bmRhcmllcyIsInBlbmRpbmdDb21wYWN0Qm91bmRhcnlVdWlkIiwib25PcGVuIiwiX3RlbXAiLCJvblNlbGVjdCIsIl90ZW1wMiIsInQ1IiwiaGlkZVRoYW5rc0FmdGVyTXMiLCJzdGF0ZSIsImxhc3RSZXNwb25zZSIsIm9wZW4iLCJoYW5kbGVTZWxlY3QiLCJ0NiIsInQ3IiwidDgiLCJmaWx0ZXIiLCJfdGVtcDMiLCJtYXAiLCJfdGVtcDQiLCJjdXJyZW50Q29tcGFjdEJvdW5kYXJpZXMiLCJ0MTAiLCJ0OSIsInByb2Nlc3MiLCJlbnYiLCJDTEFVREVfQ09ERV9ESVNBQkxFX0ZFRURCQUNLX1NVUlZFWSIsImN1cnJlbnQiLCJNYXRoIiwicmFuZG9tIiwibmV3Qm91bmRhcmllcyIsIkFycmF5IiwiZnJvbSIsImhhcyIsInQxMSIsIm1zZ18wIiwiYXBwZWFyYW5jZUlkXzAiLCJzZWxlY3RlZCIsInNtQ29tcGFjdGlvbkVuYWJsZWRfMCIsImV2ZW50X3R5cGUiLCJhcHBlYXJhbmNlX2lkIiwiYXBwZWFyYW5jZUlkIiwicmVzcG9uc2UiLCJzZXNzaW9uX21lbW9yeV9jb21wYWN0aW9uX2VuYWJsZWQiLCJzbUNvbXBhY3Rpb25FbmFibGVkIiwic3VydmV5X3R5cGUiXSwic291cmNlcyI6WyJ1c2VQb3N0Q29tcGFjdFN1cnZleS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgaXNGZWVkYmFja1N1cnZleURpc2FibGVkIH0gZnJvbSAnc3JjL3NlcnZpY2VzL2FuYWx5dGljcy9jb25maWcuanMnXG5pbXBvcnQgeyBjaGVja1N0YXRzaWdGZWF0dXJlR2F0ZV9DQUNIRURfTUFZX0JFX1NUQUxFIH0gZnJvbSAnc3JjL3NlcnZpY2VzL2FuYWx5dGljcy9ncm93dGhib29rLmpzJ1xuaW1wb3J0IHtcbiAgdHlwZSBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICBsb2dFdmVudCxcbn0gZnJvbSAnc3JjL3NlcnZpY2VzL2FuYWx5dGljcy9pbmRleC5qcydcbmltcG9ydCB7IHNob3VsZFVzZVNlc3Npb25NZW1vcnlDb21wYWN0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tcGFjdC9zZXNzaW9uTWVtb3J5Q29tcGFjdC5qcydcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQgeyBpc0VudlRydXRoeSB9IGZyb20gJy4uLy4uL3V0aWxzL2VudlV0aWxzLmpzJ1xuaW1wb3J0IHsgaXNDb21wYWN0Qm91bmRhcnlNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWVzc2FnZXMuanMnXG5pbXBvcnQgeyBsb2dPVGVsRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy90ZWxlbWV0cnkvZXZlbnRzLmpzJ1xuaW1wb3J0IHsgdXNlU3VydmV5U3RhdGUgfSBmcm9tICcuL3VzZVN1cnZleVN0YXRlLmpzJ1xuaW1wb3J0IHR5cGUgeyBGZWVkYmFja1N1cnZleVJlc3BvbnNlIH0gZnJvbSAnLi91dGlscy5qcydcblxuY29uc3QgSElERV9USEFOS1NfQUZURVJfTVMgPSAzMDAwXG5jb25zdCBQT1NUX0NPTVBBQ1RfU1VSVkVZX0dBVEUgPSAndGVuZ3VfcG9zdF9jb21wYWN0X3N1cnZleSdcbmNvbnN0IFNVUlZFWV9QUk9CQUJJTElUWSA9IDAuMiAvLyBTaG93IHN1cnZleSAyMCUgb2YgdGhlIHRpbWUgYWZ0ZXIgY29tcGFjdGlvblxuXG5mdW5jdGlvbiBoYXNNZXNzYWdlQWZ0ZXJCb3VuZGFyeShcbiAgbWVzc2FnZXM6IE1lc3NhZ2VbXSxcbiAgYm91bmRhcnlVdWlkOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYm91bmRhcnlJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChtc2cgPT4gbXNnLnV1aWQgPT09IGJvdW5kYXJ5VXVpZClcbiAgaWYgKGJvdW5kYXJ5SW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgdXNlciBvciBhc3Npc3RhbnQgbWVzc2FnZSBhZnRlciB0aGUgYm91bmRhcnlcbiAgZm9yIChsZXQgaSA9IGJvdW5kYXJ5SW5kZXggKyAxOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlc1tpXVxuICAgIGlmIChtc2cgJiYgKG1zZy50eXBlID09PSAndXNlcicgfHwgbXNnLnR5cGUgPT09ICdhc3Npc3RhbnQnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQb3N0Q29tcGFjdFN1cnZleShcbiAgbWVzc2FnZXM6IE1lc3NhZ2VbXSxcbiAgaXNMb2FkaW5nOiBib29sZWFuLFxuICBoYXNBY3RpdmVQcm9tcHQgPSBmYWxzZSxcbiAgeyBlbmFibGVkID0gdHJ1ZSB9OiB7IGVuYWJsZWQ/OiBib29sZWFuIH0gPSB7fSxcbik6IHtcbiAgc3RhdGU6XG4gICAgfCAnY2xvc2VkJ1xuICAgIHwgJ29wZW4nXG4gICAgfCAndGhhbmtzJ1xuICAgIHwgJ3RyYW5zY3JpcHRfcHJvbXB0J1xuICAgIHwgJ3N1Ym1pdHRpbmcnXG4gICAgfCAnc3VibWl0dGVkJ1xuICBsYXN0UmVzcG9uc2U6IEZlZWRiYWNrU3VydmV5UmVzcG9uc2UgfCBudWxsXG4gIGhhbmRsZVNlbGVjdDogKHNlbGVjdGVkOiBGZWVkYmFja1N1cnZleVJlc3BvbnNlKSA9PiB2b2lkXG59IHtcbiAgY29uc3QgW2dhdGVFbmFibGVkLCBzZXRHYXRlRW5hYmxlZF0gPSB1c2VTdGF0ZTxib29sZWFuIHwgbnVsbD4obnVsbClcbiAgY29uc3Qgc2VlbkNvbXBhY3RCb3VuZGFyaWVzID0gdXNlUmVmPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpXG4gIC8vIFRyYWNrIHRoZSBjb21wYWN0IGJvdW5kYXJ5IHdlJ3JlIHdhaXRpbmcgb24gKHRvIHNob3cgc3VydmV5IGFmdGVyIG5leHQgbWVzc2FnZSlcbiAgY29uc3QgcGVuZGluZ0NvbXBhY3RCb3VuZGFyeVV1aWQgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICBjb25zdCBvbk9wZW4gPSB1c2VDYWxsYmFjaygoYXBwZWFyYW5jZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzbUNvbXBhY3Rpb25FbmFibGVkID0gc2hvdWxkVXNlU2Vzc2lvbk1lbW9yeUNvbXBhY3Rpb24oKVxuICAgIGxvZ0V2ZW50KCd0ZW5ndV9wb3N0X2NvbXBhY3Rfc3VydmV5X2V2ZW50Jywge1xuICAgICAgZXZlbnRfdHlwZTpcbiAgICAgICAgJ2FwcGVhcmVkJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgYXBwZWFyYW5jZV9pZDpcbiAgICAgICAgYXBwZWFyYW5jZUlkIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICBzZXNzaW9uX21lbW9yeV9jb21wYWN0aW9uX2VuYWJsZWQ6XG4gICAgICAgIHNtQ29tcGFjdGlvbkVuYWJsZWQgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICB9KVxuICAgIHZvaWQgbG9nT1RlbEV2ZW50KCdmZWVkYmFja19zdXJ2ZXknLCB7XG4gICAgICBldmVudF90eXBlOiAnYXBwZWFyZWQnLFxuICAgICAgYXBwZWFyYW5jZV9pZDogYXBwZWFyYW5jZUlkLFxuICAgICAgc3VydmV5X3R5cGU6ICdwb3N0X2NvbXBhY3QnLFxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IG9uU2VsZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFwcGVhcmFuY2VJZDogc3RyaW5nLCBzZWxlY3RlZDogRmVlZGJhY2tTdXJ2ZXlSZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgc21Db21wYWN0aW9uRW5hYmxlZCA9IHNob3VsZFVzZVNlc3Npb25NZW1vcnlDb21wYWN0aW9uKClcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9wb3N0X2NvbXBhY3Rfc3VydmV5X2V2ZW50Jywge1xuICAgICAgICBldmVudF90eXBlOlxuICAgICAgICAgICdyZXNwb25kZWQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIGFwcGVhcmFuY2VfaWQ6XG4gICAgICAgICAgYXBwZWFyYW5jZUlkIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIHJlc3BvbnNlOlxuICAgICAgICAgIHNlbGVjdGVkIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIHNlc3Npb25fbWVtb3J5X2NvbXBhY3Rpb25fZW5hYmxlZDpcbiAgICAgICAgICBzbUNvbXBhY3Rpb25FbmFibGVkIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgdm9pZCBsb2dPVGVsRXZlbnQoJ2ZlZWRiYWNrX3N1cnZleScsIHtcbiAgICAgICAgZXZlbnRfdHlwZTogJ3Jlc3BvbmRlZCcsXG4gICAgICAgIGFwcGVhcmFuY2VfaWQ6IGFwcGVhcmFuY2VJZCxcbiAgICAgICAgcmVzcG9uc2U6IHNlbGVjdGVkLFxuICAgICAgICBzdXJ2ZXlfdHlwZTogJ3Bvc3RfY29tcGFjdCcsXG4gICAgICB9KVxuICAgIH0sXG4gICAgW10sXG4gIClcblxuICBjb25zdCB7IHN0YXRlLCBsYXN0UmVzcG9uc2UsIG9wZW4sIGhhbmRsZVNlbGVjdCB9ID0gdXNlU3VydmV5U3RhdGUoe1xuICAgIGhpZGVUaGFua3NBZnRlck1zOiBISURFX1RIQU5LU19BRlRFUl9NUyxcbiAgICBvbk9wZW4sXG4gICAgb25TZWxlY3QsXG4gIH0pXG5cbiAgLy8gQ2hlY2sgdGhlIGZlYXR1cmUgZ2F0ZSBvbiBtb3VudFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuXG4gICAgc2V0R2F0ZUVuYWJsZWQoXG4gICAgICBjaGVja1N0YXRzaWdGZWF0dXJlR2F0ZV9DQUNIRURfTUFZX0JFX1NUQUxFKFBPU1RfQ09NUEFDVF9TVVJWRVlfR0FURSksXG4gICAgKVxuICB9LCBbZW5hYmxlZF0pXG5cbiAgLy8gRmluZCBjb21wYWN0IGJvdW5kYXJ5IG1lc3NhZ2VzXG4gIGNvbnN0IGN1cnJlbnRDb21wYWN0Qm91bmRhcmllcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG5ldyBTZXQoXG4gICAgICAgIG1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcihtc2cgPT4gaXNDb21wYWN0Qm91bmRhcnlNZXNzYWdlKG1zZykpXG4gICAgICAgICAgLm1hcChtc2cgPT4gbXNnLnV1aWQpLFxuICAgICAgKSxcbiAgICBbbWVzc2FnZXNdLFxuICApXG5cbiAgLy8gRGV0ZWN0IG5ldyBjb21wYWN0IGJvdW5kYXJpZXMgYW5kIGRlZmVyIHNob3dpbmcgc3VydmV5IHVudGlsIG5leHQgbWVzc2FnZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuXG5cbiAgICAvLyBEb24ndCBwcm9jZXNzIGlmIGFscmVhZHkgc2hvd2luZ1xuICAgIGlmIChzdGF0ZSAhPT0gJ2Nsb3NlZCcgfHwgaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBEb24ndCBzaG93IHN1cnZleSB3aGVuIHBlcm1pc3Npb24gb3IgYXNrIHF1ZXN0aW9uIHByb21wdHMgYXJlIHZpc2libGVcbiAgICBpZiAoaGFzQWN0aXZlUHJvbXB0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZ2F0ZSBpcyBlbmFibGVkXG4gICAgaWYgKGdhdGVFbmFibGVkICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNGZWVkYmFja1N1cnZleURpc2FibGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHN1cnZleSBpcyBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgaWYgKGlzRW52VHJ1dGh5KHByb2Nlc3MuZW52LkNMQVVERV9DT0RFX0RJU0FCTEVfRkVFREJBQ0tfU1VSVkVZKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIGNoZWNrIGlmIHdlIGhhdmUgYSBwZW5kaW5nIGNvbXBhY3QgYW5kIGEgbmV3IG1lc3NhZ2UgaGFzIGFycml2ZWRcbiAgICBpZiAocGVuZGluZ0NvbXBhY3RCb3VuZGFyeVV1aWQuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKFxuICAgICAgICBoYXNNZXNzYWdlQWZ0ZXJCb3VuZGFyeShtZXNzYWdlcywgcGVuZGluZ0NvbXBhY3RCb3VuZGFyeVV1aWQuY3VycmVudClcbiAgICAgICkge1xuICAgICAgICAvLyBBIG5ldyBtZXNzYWdlIGFycml2ZWQgYWZ0ZXIgdGhlIGNvbXBhY3QgLSBkZWNpZGUgd2hldGhlciB0byBzaG93IHN1cnZleVxuICAgICAgICBwZW5kaW5nQ29tcGFjdEJvdW5kYXJ5VXVpZC5jdXJyZW50ID0gbnVsbFxuXG4gICAgICAgIC8vIE9ubHkgc2hvdyBzdXJ2ZXkgMjAlIG9mIHRoZSB0aW1lXG4gICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgU1VSVkVZX1BST0JBQklMSVRZKSB7XG4gICAgICAgICAgb3BlbigpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmluZCBuZXcgY29tcGFjdCBib3VuZGFyaWVzIHRoYXQgd2UgaGF2ZW4ndCBzZWVuIHlldFxuICAgIGNvbnN0IG5ld0JvdW5kYXJpZXMgPSBBcnJheS5mcm9tKGN1cnJlbnRDb21wYWN0Qm91bmRhcmllcykuZmlsdGVyKFxuICAgICAgdXVpZCA9PiAhc2VlbkNvbXBhY3RCb3VuZGFyaWVzLmN1cnJlbnQuaGFzKHV1aWQpLFxuICAgIClcblxuICAgIGlmIChuZXdCb3VuZGFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIE1hcmsgdGhlc2UgYm91bmRhcmllcyBhcyBzZWVuXG4gICAgICBzZWVuQ29tcGFjdEJvdW5kYXJpZXMuY3VycmVudCA9IG5ldyBTZXQoY3VycmVudENvbXBhY3RCb3VuZGFyaWVzKVxuXG4gICAgICAvLyBEb24ndCBzaG93IHN1cnZleSBpbW1lZGlhdGVseSAtIHdhaXQgZm9yIG5leHQgbWVzc2FnZVxuICAgICAgLy8gU3RvcmUgdGhlIG1vc3QgcmVjZW50IG5ldyBib3VuZGFyeSBVVUlEXG4gICAgICBwZW5kaW5nQ29tcGFjdEJvdW5kYXJ5VXVpZC5jdXJyZW50ID1cbiAgICAgICAgbmV3Qm91bmRhcmllc1tuZXdCb3VuZGFyaWVzLmxlbmd0aCAtIDFdIVxuICAgIH1cbiAgfSwgW1xuICAgIGVuYWJsZWQsXG4gICAgY3VycmVudENvbXBhY3RCb3VuZGFyaWVzLFxuICAgIHN0YXRlLFxuICAgIGlzTG9hZGluZyxcbiAgICBoYXNBY3RpdmVQcm9tcHQsXG4gICAgZ2F0ZUVuYWJsZWQsXG4gICAgbWVzc2FnZXMsXG4gICAgb3BlbixcbiAgXSlcblxuICByZXR1cm4geyBzdGF0ZSwgbGFzdFJlc3BvbnNlLCBoYW5kbGVTZWxlY3QgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBU0EsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUN6RSxTQUFTQyx3QkFBd0IsUUFBUSxrQ0FBa0M7QUFDM0UsU0FBU0MsMkNBQTJDLFFBQVEsc0NBQXNDO0FBQ2xHLFNBQ0UsS0FBS0MsMERBQTBELEVBQy9EQyxRQUFRLFFBQ0gsaUNBQWlDO0FBQ3hDLFNBQVNDLGdDQUFnQyxRQUFRLGdEQUFnRDtBQUNqRyxjQUFjQyxPQUFPLFFBQVEsd0JBQXdCO0FBQ3JELFNBQVNDLFdBQVcsUUFBUSx5QkFBeUI7QUFDckQsU0FBU0Msd0JBQXdCLFFBQVEseUJBQXlCO0FBQ2xFLFNBQVNDLFlBQVksUUFBUSxpQ0FBaUM7QUFDOUQsU0FB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