UNPKG

@davidlj95/ngx-meta

Version:

Set your Angular site's metadata: standard meta tags, Open Graph, Twitter Cards, JSON-LD structured data and more. Supports SSR (and Angular Universal). Use a service. Use routes' data. Set it up in a flash! 🚀

167 lines 16.8 kB
import { NgxMetaMetadataManager, } from '../../ngx-meta-metadata-manager'; /** * Creates an {@link NgxMetaMetadataManager} provider to manage some metadata. * * Check out {@link https://ngx-meta.dev/guides/manage-your-custom-metadata/ | manage your custom metadata guide} to * learn how to provide your custom metadata managers. * * @remarks * * Options can be specified using helper functions. {@link withOptions} can be used to combine more than one. * * Available option functions: * * - {@link withManagerDeps} * * - {@link withManagerGlobal} * * - {@link withManagerObjectMerging} * * @example * * ```typescript * const CUSTOM_TITLE_PROVIDER = provideNgxMetaManager<string | undefined>( * 'custom.title', * (metaElementsService: NgxMetaElementsService) => (value) => { * metaElementsService.set( * withNameAttribute('custom:title'), * withContentAttribute(value), * ) * }, * withOptions( * withManagerDeps(NgxMetaElementsService), * withGlobal('title'), * ), * ) * ``` * * @param jsonPath - Path to access the metadata value this manager needs given a JSON object * containing metadata values. Path is expressed as the keys to use to access the value * joined by a "." character. * You can use {@link withManagerJsonPath} to provide an array of keys instead. * For more information, checkout {@link MetadataResolverOptions.jsonPath} * @param setterFactory - Factory function that creates the {@link MetadataSetter} function for the manager (which * manages the metadata element on the page). * You can inject dependencies either using {@link withManagerDeps} option, that will be passed * as arguments to the setter factory function. This way is preferred, as takes fewer bytes of * your bundle size. However, type safety depends on you. * Or use {@link https://angular.dev/api/core/inject | Angular's `inject` function} for a more * type-safe option. * @param options - Extra options for the metadata manager provider creation. Use one of the helpers listed in this * method's reference docs to supply one or more of them. * @public */ export const provideNgxMetaManager = (jsonPath, setterFactory, /* istanbul ignore next - quite simple */ options = {}) => ({ provide: NgxMetaMetadataManager, multi: true, useFactory: (...deps) => ({ id: jsonPath, set: setterFactory(...deps), resolverOptions: { jsonPath: jsonPath.split('.'), global: options.g, objectMerge: options.o, }, }), deps: options.d, }); /** * Specifies dependencies to inject to the setter factory function passed to {@link provideNgxMetaManager} * * See also: * * - {@link https://angular.dev/guide/di/dependency-injection-providers#factory-providers-usefactory:~:text=property%20is%20an%20array%20of%20provider%20tokens | Factory providers' deps} * * - {@link https://angular.dev/api/core/FactoryProvider#deps | FactoryProvider#deps} * * @param deps - Dependencies to inject. Each argument declares the dependency to inject. * * @public */ export const withManagerDeps = (...deps) => ({ d: deps, }); /** * Sets the global key to use for a metadata manager created with {@link provideNgxMetaManager} * * @param global - See {@link MetadataResolverOptions.global} * * @public */ export const withManagerGlobal = (global) => ({ g: global }); /** * Enables object merging for the manager being created with {@link provideNgxMetaManager} * * See {@link MetadataResolverOptions.objectMerge} for more information. * * @public */ export const withManagerObjectMerging = () => ({ o: true, }); /** * Transforms a JSON Path specified as an array of keys into a string joined by dots. * * Useful to use with {@link provideNgxMetaManager} to avoid repeating same keys around. * * @remarks * * You can specify a type to ensure the keys are valid. See example below. * * Beware that specifying a type won't work if: * * The type refers other types and more than 2 levels are specified: * * ```typescript * interface CustomMetadata { custom: Custom } * interface Custom { moar: Moar } * * // 👇❌ Reports incorrect Typescript error about `never` type * withManagerJsonPath<CustomMetadata>('custom', 'moar', 'foo') * ``` * * More than 3 keys are specified: * * ```typescript * interface CustomMetadata { * custom: { * moar: { * moarThanMoar: { * foo: string * } * } * } * } * * // 👇❌ Reports incorrect Typescript error about `never` type * withManagerJsonPath<CustomMetadata>('custom', 'moar', 'moarThanMoar', 'foo') // * ``` * * Omit the type to skip type checking and its limitations: * * ```typescript * withManagerJsonPath('whatever', 'untyped', 'keys') * ``` * * @example * * ```typescript * interface CustomMetadata { * custom: { * title: string * } * } * * withManagerJsonPath<CustomMetadata>('custom','title') // ✅ No error. IDE helps you auto-complete. * withManagerJsonPath<CustomMetadata>('custom','not-a-prop') // ❌ Typescript error * withManagerJsonPath('no', 'type', 'checks') * ``` * * @param jsonPath - Parts of the JSON Path to join into a string. * * @public */ export const withManagerJsonPath = (...jsonPath) => jsonPath.join('.'); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3gtbWV0YS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvcmUvc3JjL21hbmFnZXJzL3Byb3ZpZGVyL3YyL3Byb3ZpZGUtbmd4LW1ldGEtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsc0JBQXNCLEdBQ3ZCLE1BQU0saUNBQWlDLENBQUE7QUFLeEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQ25DLFFBQWdCLEVBQ2hCLGFBQXVDO0FBQ3ZDLHlDQUF5QztBQUN6QyxVQUF5QyxFQUFFLEVBQ2pDLEVBQUUsQ0FDWixDQUFDO0lBQ0MsT0FBTyxFQUFFLHNCQUFzQjtJQUMvQixLQUFLLEVBQUUsSUFBSTtJQUNYLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBd0IsRUFBRSxFQUFFLENBQzFDLENBQUM7UUFDQyxFQUFFLEVBQUUsUUFBUTtRQUNaLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDM0IsZUFBZSxFQUFFO1lBQ2YsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQzdCLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqQixXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDdkI7S0FDRixDQUFxQztJQUN4QyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDaEIsQ0FBMkIsQ0FBQTtBQVk5Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FDN0IsR0FBRyxJQUFpRCxFQUNyQixFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDLEVBQUUsSUFBSTtDQUNSLENBQUMsQ0FBQTtBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLE1BQVMsRUFDc0IsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtBQUVuRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFrQyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDLEVBQUUsSUFBSTtDQUNSLENBQUMsQ0FBQTtBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQXdCLENBQ3RELEdBQUcsUUFBNkMsRUFDaEQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYWN0b3J5UHJvdmlkZXIsIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIE1ldGFkYXRhUmVzb2x2ZXJPcHRpb25zLFxuICBOZ3hNZXRhTWV0YWRhdGFNYW5hZ2VyLFxufSBmcm9tICcuLi8uLi9uZ3gtbWV0YS1tZXRhZGF0YS1tYW5hZ2VyJ1xuaW1wb3J0IHsgR2xvYmFsTWV0YWRhdGEgfSBmcm9tICcuLi8uLi8uLi9nbG9iYWxzJ1xuaW1wb3J0IHsgTWV0YWRhdGFTZXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vbWV0YWRhdGEtc2V0dGVyLWZhY3RvcnknXG5pbXBvcnQgeyBTdHJpbmdLZXlPZiB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3N0cmluZy1rZXktb2YnXG5cbi8qKlxuICogQ3JlYXRlcyBhbiB7QGxpbmsgTmd4TWV0YU1ldGFkYXRhTWFuYWdlcn0gcHJvdmlkZXIgdG8gbWFuYWdlIHNvbWUgbWV0YWRhdGEuXG4gKlxuICogQ2hlY2sgb3V0IHtAbGluayBodHRwczovL25neC1tZXRhLmRldi9ndWlkZXMvbWFuYWdlLXlvdXItY3VzdG9tLW1ldGFkYXRhLyB8IG1hbmFnZSB5b3VyIGN1c3RvbSBtZXRhZGF0YSBndWlkZX0gdG9cbiAqIGxlYXJuIGhvdyB0byBwcm92aWRlIHlvdXIgY3VzdG9tIG1ldGFkYXRhIG1hbmFnZXJzLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogT3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIGhlbHBlciBmdW5jdGlvbnMuIHtAbGluayB3aXRoT3B0aW9uc30gY2FuIGJlIHVzZWQgdG8gY29tYmluZSBtb3JlIHRoYW4gb25lLlxuICpcbiAqIEF2YWlsYWJsZSBvcHRpb24gZnVuY3Rpb25zOlxuICpcbiAqICAtIHtAbGluayB3aXRoTWFuYWdlckRlcHN9XG4gKlxuICogIC0ge0BsaW5rIHdpdGhNYW5hZ2VyR2xvYmFsfVxuICpcbiAqICAtIHtAbGluayB3aXRoTWFuYWdlck9iamVjdE1lcmdpbmd9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBDVVNUT01fVElUTEVfUFJPVklERVIgPSBwcm92aWRlTmd4TWV0YU1hbmFnZXI8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAqICAgICAnY3VzdG9tLnRpdGxlJyxcbiAqICAgICAobWV0YUVsZW1lbnRzU2VydmljZTogTmd4TWV0YUVsZW1lbnRzU2VydmljZSkgPT4gKHZhbHVlKSA9PiB7XG4gKiAgICAgICBtZXRhRWxlbWVudHNTZXJ2aWNlLnNldChcbiAqICAgICAgICAgd2l0aE5hbWVBdHRyaWJ1dGUoJ2N1c3RvbTp0aXRsZScpLFxuICogICAgICAgICB3aXRoQ29udGVudEF0dHJpYnV0ZSh2YWx1ZSksXG4gKiAgICAgICApXG4gKiAgICAgfSxcbiAqICAgICB3aXRoT3B0aW9ucyhcbiAqICAgICAgd2l0aE1hbmFnZXJEZXBzKE5neE1ldGFFbGVtZW50c1NlcnZpY2UpLFxuICogICAgICB3aXRoR2xvYmFsKCd0aXRsZScpLFxuICogICAgICksXG4gKiAgIClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBqc29uUGF0aCAtIFBhdGggdG8gYWNjZXNzIHRoZSBtZXRhZGF0YSB2YWx1ZSB0aGlzIG1hbmFnZXIgbmVlZHMgZ2l2ZW4gYSBKU09OIG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgY29udGFpbmluZyBtZXRhZGF0YSB2YWx1ZXMuIFBhdGggaXMgZXhwcmVzc2VkIGFzIHRoZSBrZXlzIHRvIHVzZSB0byBhY2Nlc3MgdGhlIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICBqb2luZWQgYnkgYSBcIi5cIiBjaGFyYWN0ZXIuXG4gKiAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB7QGxpbmsgd2l0aE1hbmFnZXJKc29uUGF0aH0gdG8gcHJvdmlkZSBhbiBhcnJheSBvZiBrZXlzIGluc3RlYWQuXG4gKiAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2tvdXQge0BsaW5rIE1ldGFkYXRhUmVzb2x2ZXJPcHRpb25zLmpzb25QYXRofVxuICogQHBhcmFtIHNldHRlckZhY3RvcnkgLSBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyB0aGUge0BsaW5rIE1ldGFkYXRhU2V0dGVyfSBmdW5jdGlvbiBmb3IgdGhlIG1hbmFnZXIgKHdoaWNoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXMgdGhlIG1ldGFkYXRhIGVsZW1lbnQgb24gdGhlIHBhZ2UpLlxuICogICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGluamVjdCBkZXBlbmRlbmNpZXMgZWl0aGVyIHVzaW5nIHtAbGluayB3aXRoTWFuYWdlckRlcHN9IG9wdGlvbiwgdGhhdCB3aWxsIGJlIHBhc3NlZFxuICogICAgICAgICAgICAgICAgICAgICAgICBhcyBhcmd1bWVudHMgdG8gdGhlIHNldHRlciBmYWN0b3J5IGZ1bmN0aW9uLiBUaGlzIHdheSBpcyBwcmVmZXJyZWQsIGFzIHRha2VzIGZld2VyIGJ5dGVzIG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHlvdXIgYnVuZGxlIHNpemUuIEhvd2V2ZXIsIHR5cGUgc2FmZXR5IGRlcGVuZHMgb24geW91LlxuICogICAgICAgICAgICAgICAgICAgICAgICBPciB1c2Uge0BsaW5rIGh0dHBzOi8vYW5ndWxhci5kZXYvYXBpL2NvcmUvaW5qZWN0IHwgQW5ndWxhcidzIGBpbmplY3RgIGZ1bmN0aW9ufSBmb3IgYSBtb3JlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtc2FmZSBvcHRpb24uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBtZXRhZGF0YSBtYW5hZ2VyIHByb3ZpZGVyIGNyZWF0aW9uLiBVc2Ugb25lIG9mIHRoZSBoZWxwZXJzIGxpc3RlZCBpbiB0aGlzXG4gKiAgICAgICAgICAgICAgICAgIG1ldGhvZCdzIHJlZmVyZW5jZSBkb2NzIHRvIHN1cHBseSBvbmUgb3IgbW9yZSBvZiB0aGVtLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcHJvdmlkZU5neE1ldGFNYW5hZ2VyID0gPFQ+KFxuICBqc29uUGF0aDogc3RyaW5nLFxuICBzZXR0ZXJGYWN0b3J5OiBNZXRhZGF0YVNldHRlckZhY3Rvcnk8VD4sXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gcXVpdGUgc2ltcGxlICovXG4gIG9wdGlvbnM6IF9Qcm92aWRlTmd4TWV0YU1hbmFnZXJPcHRpb25zID0ge30sXG4pOiBQcm92aWRlciA9PlxuICAoe1xuICAgIHByb3ZpZGU6IE5neE1ldGFNZXRhZGF0YU1hbmFnZXIsXG4gICAgbXVsdGk6IHRydWUsXG4gICAgdXNlRmFjdG9yeTogKC4uLmRlcHM6IHJlYWRvbmx5IHVua25vd25bXSkgPT5cbiAgICAgICh7XG4gICAgICAgIGlkOiBqc29uUGF0aCxcbiAgICAgICAgc2V0OiBzZXR0ZXJGYWN0b3J5KC4uLmRlcHMpLFxuICAgICAgICByZXNvbHZlck9wdGlvbnM6IHtcbiAgICAgICAgICBqc29uUGF0aDoganNvblBhdGguc3BsaXQoJy4nKSxcbiAgICAgICAgICBnbG9iYWw6IG9wdGlvbnMuZyxcbiAgICAgICAgICBvYmplY3RNZXJnZTogb3B0aW9ucy5vLFxuICAgICAgICB9LFxuICAgICAgfSkgc2F0aXNmaWVzIE5neE1ldGFNZXRhZGF0YU1hbmFnZXI8VD4sXG4gICAgZGVwczogb3B0aW9ucy5kLFxuICB9KSBzYXRpc2ZpZXMgRmFjdG9yeVByb3ZpZGVyXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIF9Qcm92aWRlTmd4TWV0YU1hbmFnZXJPcHRpb25zID0gUGFydGlhbDx7XG4gIGQ6IEZhY3RvcnlQcm92aWRlclsnZGVwcyddXG4gIGc6IE1ldGFkYXRhUmVzb2x2ZXJPcHRpb25zWydnbG9iYWwnXVxuICBpOiBOZ3hNZXRhTWV0YWRhdGFNYW5hZ2VyWydpZCddXG4gIG86IE1ldGFkYXRhUmVzb2x2ZXJPcHRpb25zWydvYmplY3RNZXJnZSddXG59PlxuXG4vKipcbiAqIFNwZWNpZmllcyBkZXBlbmRlbmNpZXMgdG8gaW5qZWN0IHRvIHRoZSBzZXR0ZXIgZmFjdG9yeSBmdW5jdGlvbiBwYXNzZWQgdG8ge0BsaW5rIHByb3ZpZGVOZ3hNZXRhTWFuYWdlcn1cbiAqXG4gKiBTZWUgYWxzbzpcbiAqXG4gKiAtIHtAbGluayBodHRwczovL2FuZ3VsYXIuZGV2L2d1aWRlL2RpL2RlcGVuZGVuY3ktaW5qZWN0aW9uLXByb3ZpZGVycyNmYWN0b3J5LXByb3ZpZGVycy11c2VmYWN0b3J5On46dGV4dD1wcm9wZXJ0eSUyMGlzJTIwYW4lMjBhcnJheSUyMG9mJTIwcHJvdmlkZXIlMjB0b2tlbnMgfCBGYWN0b3J5IHByb3ZpZGVycycgZGVwc31cbiAqXG4gKiAtIHtAbGluayBodHRwczovL2FuZ3VsYXIuZGV2L2FwaS9jb3JlL0ZhY3RvcnlQcm92aWRlciNkZXBzIHwgRmFjdG9yeVByb3ZpZGVyI2RlcHN9XG4gKlxuICogQHBhcmFtIGRlcHMgLSBEZXBlbmRlbmNpZXMgdG8gaW5qZWN0LiBFYWNoIGFyZ3VtZW50IGRlY2xhcmVzIHRoZSBkZXBlbmRlbmN5IHRvIGluamVjdC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTWFuYWdlckRlcHMgPSAoXG4gIC4uLmRlcHM6IEV4Y2x1ZGU8RmFjdG9yeVByb3ZpZGVyWydkZXBzJ10sIHVuZGVmaW5lZD5cbik6IF9Qcm92aWRlTmd4TWV0YU1hbmFnZXJPcHRpb25zID0+ICh7XG4gIGQ6IGRlcHMsXG59KVxuXG4vKipcbiAqIFNldHMgdGhlIGdsb2JhbCBrZXkgdG8gdXNlIGZvciBhIG1ldGFkYXRhIG1hbmFnZXIgY3JlYXRlZCB3aXRoIHtAbGluayBwcm92aWRlTmd4TWV0YU1hbmFnZXJ9XG4gKlxuICogQHBhcmFtIGdsb2JhbCAtIFNlZSB7QGxpbmsgTWV0YWRhdGFSZXNvbHZlck9wdGlvbnMuZ2xvYmFsfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNYW5hZ2VyR2xvYmFsID0gPEcgZXh0ZW5kcyBzdHJpbmcgPSBrZXlvZiBHbG9iYWxNZXRhZGF0YT4oXG4gIGdsb2JhbDogRyxcbik6IF9Qcm92aWRlTmd4TWV0YU1hbmFnZXJPcHRpb25zID0+ICh7IGc6IGdsb2JhbCB9KVxuXG4vKipcbiAqIEVuYWJsZXMgb2JqZWN0IG1lcmdpbmcgZm9yIHRoZSBtYW5hZ2VyIGJlaW5nIGNyZWF0ZWQgd2l0aCB7QGxpbmsgcHJvdmlkZU5neE1ldGFNYW5hZ2VyfVxuICpcbiAqIFNlZSB7QGxpbmsgTWV0YWRhdGFSZXNvbHZlck9wdGlvbnMub2JqZWN0TWVyZ2V9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNYW5hZ2VyT2JqZWN0TWVyZ2luZyA9ICgpOiBfUHJvdmlkZU5neE1ldGFNYW5hZ2VyT3B0aW9ucyA9PiAoe1xuICBvOiB0cnVlLFxufSlcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgSlNPTiBQYXRoIHNwZWNpZmllZCBhcyBhbiBhcnJheSBvZiBrZXlzIGludG8gYSBzdHJpbmcgam9pbmVkIGJ5IGRvdHMuXG4gKlxuICogVXNlZnVsIHRvIHVzZSB3aXRoIHtAbGluayBwcm92aWRlTmd4TWV0YU1hbmFnZXJ9IHRvIGF2b2lkIHJlcGVhdGluZyBzYW1lIGtleXMgYXJvdW5kLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogWW91IGNhbiBzcGVjaWZ5IGEgdHlwZSB0byBlbnN1cmUgdGhlIGtleXMgYXJlIHZhbGlkLiBTZWUgZXhhbXBsZSBiZWxvdy5cbiAqXG4gKiBCZXdhcmUgdGhhdCBzcGVjaWZ5aW5nIGEgdHlwZSB3b24ndCB3b3JrIGlmOlxuICpcbiAqIFRoZSB0eXBlIHJlZmVycyBvdGhlciB0eXBlcyBhbmQgbW9yZSB0aGFuIDIgbGV2ZWxzIGFyZSBzcGVjaWZpZWQ6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW50ZXJmYWNlIEN1c3RvbU1ldGFkYXRhIHsgY3VzdG9tOiBDdXN0b20gfVxuICogaW50ZXJmYWNlIEN1c3RvbSB7IG1vYXI6IE1vYXIgfVxuICpcbiAqIC8vIPCfkYfinYwgUmVwb3J0cyBpbmNvcnJlY3QgVHlwZXNjcmlwdCBlcnJvciBhYm91dCBgbmV2ZXJgIHR5cGVcbiAqIHdpdGhNYW5hZ2VySnNvblBhdGg8Q3VzdG9tTWV0YWRhdGE+KCdjdXN0b20nLCAnbW9hcicsICdmb28nKVxuICogYGBgXG4gKlxuICogTW9yZSB0aGFuIDMga2V5cyBhcmUgc3BlY2lmaWVkOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGludGVyZmFjZSBDdXN0b21NZXRhZGF0YSB7XG4gKiAgIGN1c3RvbToge1xuICogICAgIG1vYXI6IHtcbiAqICAgICAgIG1vYXJUaGFuTW9hcjoge1xuICogICAgICAgICBmb286IHN0cmluZ1xuICogICAgICAgfVxuICogICAgIH1cbiAqICAgfVxuICogfVxuICpcbiAqIC8vIPCfkYfinYwgUmVwb3J0cyBpbmNvcnJlY3QgVHlwZXNjcmlwdCBlcnJvciBhYm91dCBgbmV2ZXJgIHR5cGVcbiAqIHdpdGhNYW5hZ2VySnNvblBhdGg8Q3VzdG9tTWV0YWRhdGE+KCdjdXN0b20nLCAnbW9hcicsICdtb2FyVGhhbk1vYXInLCAnZm9vJykgLy9cbiAqIGBgYFxuICpcbiAqIE9taXQgdGhlIHR5cGUgdG8gc2tpcCB0eXBlIGNoZWNraW5nIGFuZCBpdHMgbGltaXRhdGlvbnM6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogd2l0aE1hbmFnZXJKc29uUGF0aCgnd2hhdGV2ZXInLCAndW50eXBlZCcsICdrZXlzJylcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW50ZXJmYWNlIEN1c3RvbU1ldGFkYXRhIHtcbiAqICAgY3VzdG9tOiB7XG4gKiAgICAgdGl0bGU6IHN0cmluZ1xuICogICB9XG4gKiB9XG4gKlxuICogd2l0aE1hbmFnZXJKc29uUGF0aDxDdXN0b21NZXRhZGF0YT4oJ2N1c3RvbScsJ3RpdGxlJykgLy8g4pyFIE5vIGVycm9yLiBJREUgaGVscHMgeW91IGF1dG8tY29tcGxldGUuXG4gKiB3aXRoTWFuYWdlckpzb25QYXRoPEN1c3RvbU1ldGFkYXRhPignY3VzdG9tJywnbm90LWEtcHJvcCcpIC8vIOKdjCBUeXBlc2NyaXB0IGVycm9yXG4gKiB3aXRoTWFuYWdlckpzb25QYXRoKCdubycsICd0eXBlJywgJ2NoZWNrcycpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ganNvblBhdGggLSBQYXJ0cyBvZiB0aGUgSlNPTiBQYXRoIHRvIGpvaW4gaW50byBhIHN0cmluZy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTWFuYWdlckpzb25QYXRoOiBXaXRoTWFuYWdlckpzb25QYXRoID0gKFxuICAuLi5qc29uUGF0aDogTWV0YWRhdGFSZXNvbHZlck9wdGlvbnNbJ2pzb25QYXRoJ11cbikgPT4ganNvblBhdGguam9pbignLicpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmludGVyZmFjZSBXaXRoTWFuYWdlckpzb25QYXRoIHtcbiAgPFQgZXh0ZW5kcyBvYmplY3Q+KGtleTE6IFN0cmluZ0tleU9mPFQ+KTogc3RyaW5nXG4gIDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICBrZXkxOiBTdHJpbmdLZXlPZjxUPixcbiAgICBrZXkyOiBTdHJpbmdLZXlPZjxUW3R5cGVvZiBrZXkxXT4sXG4gICk6IHN0cmluZ1xuICA8VCBleHRlbmRzIG9iamVjdD4oXG4gICAga2V5MTogU3RyaW5nS2V5T2Y8VD4sXG4gICAga2V5MjogU3RyaW5nS2V5T2Y8VFt0eXBlb2Yga2V5MV0+LFxuICAgIGtleTM6IFN0cmluZ0tleU9mPFRbdHlwZW9mIGtleTFdW3R5cGVvZiBrZXkyXT4sXG4gICk6IHN0cmluZ1xuICAoLi4uanNvblBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1xufVxuIl19