Skip to content

Commit

Permalink
♻️ Core extraction: function helpers, date helpers, signals (#33932)
Browse files Browse the repository at this point in the history
* Move utils/signals to src/core/data-structures

* Move parseDate/getDate to src/core

* Move src/utils/function to src/core/types

* Move src/utils/rate-limit to src/core/types/function

* Remove leftover src/utils/signals

* update dep-check config

* update legacy describe block

* Remove forbidden terms exception for update tests file

* Update .getTime allowlist entry in forbidden-terms

* Update imports of signals

* Update imports of date helpers

* Update imports of function#once

* Update imports of rate-limit helpers

* Fix imports in test files

* Fix import for newly added file
  • Loading branch information
rcebulko committed Apr 21, 2021
1 parent cd33789 commit e14c2b6
Show file tree
Hide file tree
Showing 74 changed files with 259 additions and 222 deletions.
2 changes: 1 addition & 1 deletion 3p/frame-metadata.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import {dev} from '../src/log';
import {dict} from '../src/core/types/object';
import {getMode} from '../src/mode';
import {once} from '../src/utils/function.js';
import {once} from '../src/core/types/function.js';
import {parseJson} from '../src/json';
import {parseUrlDeprecated} from '../src/url';

Expand Down
2 changes: 1 addition & 1 deletion ads/google/imaVideo.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {camelCaseToTitleCase, px, setStyle, setStyles} from '../../src/style';
import {getData} from '../../src/event-helper';
import {isObject} from '../../src/core/types';
import {loadScript} from '../../3p/3p';
import {throttle} from '../../src/utils/rate-limit';
import {throttle} from '../../src/core/types/function';
import {tryParseJson} from '../../src/json';

/**
Expand Down
2 changes: 1 addition & 1 deletion ads/inabox/position-observer.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {
moveLayoutRect,
} from '../../src/layout-rect';
import {Observable} from '../../src/core/data-structures/observable';
import {throttle} from '../../src/utils/rate-limit';
import {throttle} from '../../src/core/types/function';

/**
* @typedef {{
Expand Down
6 changes: 3 additions & 3 deletions build-system/test-configs/dep-check-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,14 @@ exports.rules = [
filesMatching: '3p/**/*.js',
mustNotDependOn: 'src/**/*.js',
allowlist: [
'3p/**->src/utils/function.js',
'3p/**->src/core/constants/amp-events.js',
'3p/**->src/core/data-structures/observable.js',
'3p/**->src/core/data-structures/promise.js',
'3p/**->src/core/error.js',
'3p/**->src/core/types/function.js',
'3p/**->src/core/types/index.js',
'3p/**->src/core/types/string.js',
'3p/**->src/core/types/object.js',
'3p/**->src/core/types/string.js',
'3p/**->src/log.js',
'3p/**->src/style.js',
'3p/**->src/url.js',
Expand Down Expand Up @@ -121,10 +121,10 @@ exports.rules = [
allowlist: [
'ads/**->src/utils/dom-fingerprint.js',
'ads/**->src/core/error.js',
'ads/**->src/core/types/function.js',
'ads/**->src/core/types/index.js',
'ads/**->src/core/types/object.js',
'ads/**->src/core/types/string.js',
'ads/**->src/utils/rate-limit.js',
'ads/**->src/log.js',
'ads/**->src/mode.js',
'ads/**->src/url.js',
Expand Down
3 changes: 1 addition & 2 deletions build-system/test-configs/forbidden-terms.js
Original file line number Diff line number Diff line change
Expand Up @@ -829,7 +829,6 @@ const forbiddenTermsGlobal = {
'test/unit/test-xhr.js',
'test/unit/utils/test-base64.js',
'test/unit/utils/test-bytes.js',
'test/unit/utils/test-rate-limit.js',
'test/unit/web-worker/test-amp-worker.js',
],
checkInTestFolder: true,
Expand Down Expand Up @@ -995,7 +994,7 @@ const forbiddenTermsSrcInclusive = {
'.github/workflows/create-design-review-issue.js',
'extensions/amp-timeago/0.1/amp-timeago.js',
'extensions/amp-timeago/1.0/component.js',
'src/utils/date.js',
'src/core/types/date.js',
],
},
'\\.expandStringSync\\(': {
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-a4a/0.1/test/test-amp-a4a.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import {GEO_IN_GROUP} from '../../../amp-geo/0.1/amp-geo-in-group';
import {LayoutPriority} from '../../../../src/layout';
import {MockA4AImpl, TEST_URL} from './utils';
import {Services} from '../../../../src/services';
import {Signals} from '../../../../src/utils/signals';
import {Signals} from '../../../../src/core/data-structures/signals';
import {cancellation} from '../../../../src/error-reporting';
import {createElementWithAttributes} from '../../../../src/dom';
import {createIframePromise} from '../../../../testing/iframe';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-access-scroll/0.1/read-depth-tracker.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/

import {Services} from '../../../src/services';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';

export class ReadDepthTracker {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {getData} from '../../../src/event-helper';
import {getPageLayoutBoxBlocking} from '../../../src/utils/page-layout-box';
import {getStyle, setStyles} from '../../../src/style';
import {parseUrlDeprecated} from '../../../src/url';
import {throttle} from '../../../src/utils/rate-limit';
import {throttle} from '../../../src/core/types/function';
import {tryParseJson} from '../../../src/json';

/**
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-ad/0.1/amp-ad-xorigin-iframe-handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import {isGoogleAdsA4AValidEnvironment} from '../../../ads/google/a4a/utils';
import {removeElement} from '../../../src/dom';
import {reportErrorToAnalytics} from '../../../src/error-reporting';
import {setStyle} from '../../../src/style';
import {throttle} from '../../../src/utils/rate-limit';
import {throttle} from '../../../src/core/types/function';

const VISIBILITY_TIMEOUT = 10000;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {AmpAdUIHandler} from '../amp-ad-ui';
import {AmpAdXOriginIframeHandler} from '../amp-ad-xorigin-iframe-handler';
import {BaseElement} from '../../../../src/base-element';
import {Services} from '../../../../src/services';
import {Signals} from '../../../../src/utils/signals';
import {Signals} from '../../../../src/core/data-structures/signals';
import {
createIframeWithMessageStub,
expectPostMessage,
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-analytics/0.1/test/test-events.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import {
} from '../events';
import {AmpdocAnalyticsRoot} from '../analytics-root';
import {Deferred} from '../../../../src/core/data-structures/promise';
import {Signals} from '../../../../src/utils/signals';
import {Signals} from '../../../../src/core/data-structures/signals';
import {macroTask} from '../../../../testing/yield';
import {toggleExperiment} from '../../../../src/experiments';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import {
scan,
} from '../amp-auto-lightbox';
import {Services} from '../../../../src/services';
import {Signals} from '../../../../src/utils/signals';
import {Signals} from '../../../../src/core/data-structures/signals';
import {createElementWithAttributes} from '../../../../src/dom';
import {htmlFor} from '../../../../src/static-template';
import {isArray} from '../../../../src/core/types';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-autocomplete/0.1/amp-autocomplete.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import {isAmp4Email} from '../../../src/format';
import {isArray, isEnumValue} from '../../../src/core/types';

import {mod} from '../../../src/utils/math';
import {once} from '../../../src/utils/function';
import {once} from '../../../src/core/types/function';
import {removeChildren, tryFocus} from '../../../src/dom';
import {
setupAMPCors,
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-base-carousel/0.1/auto-advance.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import {ActionSource} from './action-source';
import {CarouselEvents} from './carousel-events';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {getDetail, listen, listenOnce} from '../../../src/event-helper';

const MIN_AUTO_ADVANCE_INTERVAL = 1000;
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-base-carousel/0.1/carousel.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import {CarouselEvents} from './carousel-events';
import {backwardWrappingDistance, forwardWrappingDistance} from './array-util';
import {clamp, mod} from '../../../src/utils/math';
import {createCustomEvent, listen, listenOnce} from '../../../src/event-helper';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {dev} from '../../../src/log';
import {dict} from '../../../src/core/types/object';
import {
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-base-carousel/1.0/scroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {
scrollContainerToElement,
} from './dimensions';
import {LightboxGalleryContext} from '../../amp-lightbox-gallery/1.0/context';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {forwardRef} from '../../../src/preact/compat';
import {mod} from '../../../src/utils/math';
import {setStyle} from '../../../src/style';
Expand Down
4 changes: 2 additions & 2 deletions extensions/amp-bind/0.1/bind-impl.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ import {ChunkPriority, chunk} from '../../../src/chunk';
import {Deferred} from '../../../src/core/data-structures/promise';
import {RAW_OBJECT_ARGS_KEY} from '../../../src/core/constants/action-constants';
import {Services} from '../../../src/services';
import {Signals} from '../../../src/utils/signals';
import {Signals} from '../../../src/core/data-structures/signals';
import {
closestAncestorElementBySelector,
iterateCursor,
whenUpgradedToCustomElement,
} from '../../../src/dom';
import {createCustomEvent, getDetail} from '../../../src/event-helper';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {deepEquals, getValueForExpr, parseJson} from '../../../src/json';
import {deepMerge, dict, map} from '../../../src/core/types/object';
import {dev, devAssert, user} from '../../../src/log';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-byside-content/0.1/amp-byside-content.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {CSS} from '../../../build/amp-byside-content-0.1.css';
import {Services} from '../../../src/services';
import {addParamsToUrl, assertHttpsUrl} from '../../../src/url';
import {createElementWithAttributes, removeElement} from '../../../src/dom';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {dict} from '../../../src/core/types/object';
import {isLayoutSizeDefined} from '../../../src/layout';
import {listenFor} from '../../../src/iframe-helper';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-date-countdown/1.0/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import * as Preact from '../../../src/preact';
import {Wrapper, useRenderer} from '../../../src/preact/component';
import {dict} from '../../../src/core/types/object';
import {getDate} from '../../../src/utils/date';
import {getDate} from '../../../src/core/types/date';
import {getLocaleStrings} from './messages';
import {useAmpContext} from '../../../src/preact/context';
import {useEffect, useMemo, useRef, useState} from '../../../src/preact';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-date-display/1.0/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import * as Preact from '../../../src/preact';
import {Wrapper, useRenderer} from '../../../src/preact/component';
import {getDate} from '../../../src/utils/date';
import {getDate} from '../../../src/core/types/date';
import {useMemo} from '../../../src/preact';
import {useResourcesNotify} from '../../../src/preact/utils';

Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-date-picker/0.1/amp-date-picker.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import {dashToCamelCase} from '../../../src/core/types/string';
import {dev, devAssert, user, userAssert} from '../../../src/log';
import {dict, map} from '../../../src/core/types/object';
import {escapeCssSelectorIdent} from '../../../src/css';
import {once} from '../../../src/utils/function';
import {once} from '../../../src/core/types/function';
import {requireExternal} from '../../../src/module';

/**
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-fit-text/0.1/amp-fit-text.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import {CSS} from '../../../build/amp-fit-text-0.1.css';
import {getLengthNumeral, isLayoutSizeDefined} from '../../../src/layout';
import {px, setStyle, setStyles} from '../../../src/style';
import {throttle} from '../../../src/utils/rate-limit';
import {throttle} from '../../../src/core/types/function';

const TAG = 'amp-fit-text';
const LINE_HEIGHT_EM_ = 1.15;
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-form/0.1/amp-form-textarea.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {computedStyle, px, setStyle} from '../../../src/style';
import {dev, devAssert, user} from '../../../src/log';
import {iterateCursor, removeElement} from '../../../src/dom';
import {listen, listenOncePromise} from '../../../src/event-helper';
import {throttle} from '../../../src/utils/rate-limit';
import {throttle} from '../../../src/core/types/function';
import {toArray} from '../../../src/core/types/array';

const AMP_FORM_TEXTAREA_EXPAND_ATTR = 'autoexpand';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-fx-collection/0.1/scroll-toggle.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import {Observable} from '../../../src/core/data-structures/observable';
import {Services} from '../../../src/services';
import {devAssert, user} from '../../../src/log';
import {once} from '../../../src/utils/function';
import {once} from '../../../src/core/types/function';
import {px, setImportantStyles} from '../../../src/style';

const TAG = 'amp-fx';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-jwplayer/0.1/amp-jwplayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import {getData, listen} from '../../../src/event-helper';
import {getMode} from '../../../src/mode';
import {installVideoManagerForDoc} from '../../../src/service/video-manager-impl';
import {isLayoutSizeDefined} from '../../../src/layout';
import {once} from '../../../src/utils/function';
import {once} from '../../../src/core/types/function';

const JWPLAYER_EVENTS = {
'ready': VideoEvents.LOAD,
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-lightbox/0.1/amp-lightbox.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import {
toggle,
} from '../../../src/style';
import {createCustomEvent} from '../../../src/event-helper';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {dev, devAssert, user} from '../../../src/log';
import {dict, hasOwn} from '../../../src/core/types/object';
import {getMode} from '../../../src/mode';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-next-page/1.0/visibility-observer.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import {
import {RelativePositions} from '../../../src/layout-rect';
import {Services} from '../../../src/services';
import {devAssert} from '../../../src/log';
import {throttle} from '../../../src/utils/rate-limit';
import {throttle} from '../../../src/core/types/function';

/** @enum {number} */
export const ViewportRelativePos = {
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-sidebar/0.1/amp-sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
tryFocus,
} from '../../../src/dom';
import {createCustomEvent} from '../../../src/event-helper';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {descendsFromStory} from '../../../src/utils/story';
import {dev, devAssert} from '../../../src/log';
import {dict} from '../../../src/core/types/object';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-sidebar/0.2/amp-sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
tryFocus,
} from '../../../src/dom';
import {createCustomEvent} from '../../../src/event-helper';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {descendsFromStory} from '../../../src/utils/story';
import {dev, devAssert, userAssert} from '../../../src/log';
import {dict} from '../../../src/core/types/object';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-skimlinks/0.1/amp-skimlinks.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import {CommonSignals} from '../../../src/core/constants/common-signals';
import {Services} from '../../../src/services';
import {once} from '../../../src/utils/function';
import {once} from '../../../src/core/types/function';

import {Tracking} from './tracking';

Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-story/1.0/amp-story-page.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ import {
whenUpgradedToCustomElement,
} from '../../../src/dom';
import {createShadowRootWithStyle, setTextBackgroundColor} from './utils';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {delegateAutoplay} from '../../../src/video-interface';
import {dev} from '../../../src/log';
import {dict} from '../../../src/core/types/object';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-story/1.0/amp-story-request-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {Services} from '../../../src/services';
import {childElementByTag} from '../../../src/dom';
import {getChildJsonConfig} from '../../../src/json';
import {isProtocolValid} from '../../../src/url';
import {once} from '../../../src/utils/function';
import {once} from '../../../src/core/types/function';
import {registerServiceBuilder} from '../../../src/service';
import {user, userAssert} from '../../../src/log';

Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-story/1.0/amp-story-share.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {isObject} from '../../../src/core/types';
import {listen} from '../../../src/event-helper';
import {px, setImportantStyles} from '../../../src/style';
import {renderAsElement, renderSimpleTemplate} from './simple-template';
import {throttle} from '../../../src/utils/rate-limit';
import {throttle} from '../../../src/core/types/function';

/**
* Maps share provider type to visible name.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import {createShadowRootWithStyle} from './utils';
import {getLocalizationService} from './amp-story-localization-service';
import {htmlFor} from '../../../src/static-template';
import {listen} from '../../../src/event-helper';
import {throttle} from '../../../src/utils/rate-limit';
import {throttle} from '../../../src/core/types/function';

/**
* CSS class indicating the format is landscape.
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-story/1.0/amp-story.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ import {
toggle,
} from '../../../src/style';
import {createPseudoLocale} from '../../../src/localized-strings';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {dev, devAssert, user} from '../../../src/log';
import {dict, map} from '../../../src/core/types/object';
import {endsWith} from '../../../src/core/types/string';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-story/1.0/progress-bar.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {
UIType,
getStoreService,
} from './amp-story-store-service';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {dev, devAssert} from '../../../src/log';
import {escapeCssSelectorNth} from '../../../src/css';
import {hasOwn, map} from '../../../src/core/types/object';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-story/1.0/test/test-amp-story-page.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {Deferred} from '../../../../src/core/data-structures/promise';
import {LocalizationService} from '../../../../src/service/localization';
import {MediaType} from '../media-pool';
import {Services} from '../../../../src/services';
import {Signals} from '../../../../src/utils/signals';
import {Signals} from '../../../../src/core/data-structures/signals';
import {VideoUtils} from '../../../../src/utils/video';
import {
addAttributesToElement,
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-tiktok/0.1/amp-tiktok.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {
createElementWithAttributes,
removeElement,
} from '../../../src/dom';
import {debounce} from '../../../src/utils/rate-limit';
import {debounce} from '../../../src/core/types/function';
import {getData, listen} from '../../../src/event-helper';
import {isLayoutSizeDefined} from '../../../src/layout';
import {px, resetStyles, setStyles} from '../../../src/style';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-timeago/1.0/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import * as Preact from '../../../src/preact';
import {Wrapper} from '../../../src/preact/component';
import {format, getLocale} from './locales';
import {getDate} from '../../../src/utils/date';
import {getDate} from '../../../src/core/types/date';
import {toWin} from '../../../src/types';
import {useEffect, useRef, useState} from '../../../src/preact';
import {useResourcesNotify} from '../../../src/preact/utils';
Expand Down
2 changes: 1 addition & 1 deletion extensions/amp-video-docking/0.1/amp-video-docking.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ import {htmlFor, htmlRefs} from '../../../src/static-template';
import {installStylesForDoc} from '../../../src/style-installer';
import {isRTL, removeElement, scopedQuerySelector} from '../../../src/dom';
import {layoutRectEquals, rectIntersection} from '../../../src/layout-rect';
import {once} from '../../../src/utils/function';
import {once} from '../../../src/core/types/function';
import {
px,
resetStyles,
Expand Down

0 comments on commit e14c2b6

Please sign in to comment.