mol_text_distance 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.nojekyll ADDED
File without changes
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # $mol_text_distance
2
+
3
+ Calculates the lexicographical distance between two texts.
4
+
5
+ ## Usage
6
+
7
+ ```ts
8
+ // 0.18
9
+ $mol_text_distance(
10
+ `little meerkat jumps over big elephant`,
11
+ `over little elephant jumps big meerkat`,
12
+ )
13
+
14
+ // 0.66
15
+ $mol_text_distance(
16
+ `A structural comparison of arbitrary objects is discussed.`,
17
+ `Application of caching for correct comparison of cyclic references is disclosed.`,
18
+ )
19
+ ```
20
+
21
+ ## Algorithm
22
+
23
+ - A simple and fast.
24
+ - Normalized from 0 to 1.
25
+ - Rearrangement of words gives short distance.
26
+ - Independent of texts length.
27
+ - Independent of changes position.
28
+ - Complexity O(n).
29
+ - Memory usage O(log n).
30
+
31
+ ## NPM Bundle
32
+
33
+ ```sh
34
+ npm install mol_text_distance
35
+ ```
36
+
37
+ 1KB [![](https://badgen.net/bundlephobia/minzip/mol_text_distance)](https://bundlephobia.com/package/mol_text_distance)
38
+
39
+ ```ts
40
+ import { $mol_text_distance } from 'mol_text_distance'
41
+ ```
package/node.audit.js ADDED
@@ -0,0 +1 @@
1
+ console.info("Audit passed")
package/node.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ declare let _$_: {
2
+ new (): {};
3
+ } & typeof globalThis;
4
+ declare class $ extends _$_ {
5
+ }
6
+ declare namespace $ {
7
+ export type $ = typeof $$;
8
+ export class $$ extends $ {
9
+ }
10
+ namespace $$ {
11
+ type $$ = $;
12
+ }
13
+ export {};
14
+ }
15
+
16
+ declare namespace $ {
17
+ function $mol_text_key(text: string): Map<string, number>;
18
+ }
19
+
20
+ declare namespace $ {
21
+ function $mol_text_key_distance(left: Map<string, number>, right: Map<string, number>): number;
22
+ }
23
+
24
+ declare namespace $ {
25
+ function $mol_text_distance(left: string, right: string): number;
26
+ }
27
+
28
+ export = $;
package/node.deps.json ADDED
@@ -0,0 +1 @@
1
+ {"files":["LICENSE","README.md","lang.lang.tree","mam.jam.js","mam.ts","package.json","sandbox.config.json","tsconfig.json","tsfmt.json","yarn.lock","mol/CNAME","mol/CODE_OF_CONDUCT.md","mol/CONTRIBUTING.md","mol/LICENSE","mol/index.html","mol/mol.meta.tree","mol/readme.md","mol/text/key/key.ts","mol/text/key/distance/distance.ts","mol/text/distance/distance.ts","mol/text/distance/readme.md"],"mods":{},"deps_in":{"mol/text":{"mol/text/distance":-9007199254740991,"mol/text/key":-9007199254740991},"mol":{"mol/text":-9007199254740991},"":{"mol":-9007199254740991},"mol/text/key/distance":{"mol/text/distance":-2},"mol/text/key":{"mol/text/key/distance":-9007199254740991,"mol/text/distance":-3}},"deps_out":{"mol/text/distance":{"mol/text":-9007199254740991,"mol/text/key/distance":-2,"mol/text/key":-3},"mol/text":{"mol":-9007199254740991},"mol":{"":-9007199254740991},"mol/text/key/distance":{"mol/text/key":-9007199254740991},"mol/text/key":{"mol/text":-9007199254740991}},"sloc":{"LICENSE":113,"md":501,"tree":31,"js":10,"ts":55,"json":85,"lock":994,"CNAME":1,"html":1},"deps":{"mol/text/distance":{"..":-9007199254740991,"/mol/text/distance":-1,"/mol/text/key/distance":-2,"/mol/text/key":-3},"mol/text":{"..":-9007199254740991},"mol":{"..":-9007199254740991},"":{},"mol/text/key/distance":{"..":-9007199254740991,"/mol/text/key/distance":-1},"mol/text/key":{"..":-9007199254740991,"/mol/text/key":-1}}}
package/node.esm.js ADDED
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var exports = void 0;
3
+ "use strict"
4
+
5
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ else for (var i = decorators.length - 1; i >= 0; i--) if ((d = decorators[i])) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ };
11
+
12
+ var globalThis = globalThis || ( typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this )
13
+ var $ = ( typeof module === 'object' ) ? ( module['export'+'s'] = globalThis ) : globalThis
14
+ $.$$ = $
15
+
16
+ ;
17
+
18
+ var $node = $node || {}
19
+ void function( module ) { var exports = module.exports = this; function require( id ) { return $node[ id.replace( /^.\// , "../" ) ] };
20
+ ;
21
+ "use strict";
22
+ Error.stackTraceLimit = 50;
23
+ var $;
24
+ (function ($) {
25
+ })($ || ($ = {}));
26
+ module.exports = $;
27
+ //mam.ts
28
+ ;
29
+
30
+ $node[ "../mam.ts" ] = $node[ "../mam.ts" ] = module.exports }.call( {} , {} )
31
+ ;
32
+ "use strict";
33
+ var $;
34
+ (function ($) {
35
+ function $mol_text_key(text) {
36
+ text = '\n\n' + text + '\r\r';
37
+ const key = new Map();
38
+ for (let i = 0; i < text.length - 2; ++i) {
39
+ const trigram = text.slice(i, i + 3);
40
+ const count = key.get(trigram) ?? 0;
41
+ key.set(trigram, count + 1);
42
+ }
43
+ return key;
44
+ }
45
+ $.$mol_text_key = $mol_text_key;
46
+ })($ || ($ = {}));
47
+ //mol/text/key/key.ts
48
+ ;
49
+ "use strict";
50
+ var $;
51
+ (function ($) {
52
+ function $mol_text_key_distance(left, right) {
53
+ let dist = -4;
54
+ let total = -4;
55
+ for (const [trigram, left_count] of left) {
56
+ total += left_count;
57
+ const right_count = right.get(trigram) ?? 0;
58
+ dist += Math.abs(left_count - right_count);
59
+ }
60
+ for (const [trigram, right_count] of right) {
61
+ total += right_count;
62
+ const left_count = left.get(trigram) ?? 0;
63
+ dist += Math.abs(left_count - right_count);
64
+ }
65
+ if (dist < 0)
66
+ return 0;
67
+ return dist / total;
68
+ }
69
+ $.$mol_text_key_distance = $mol_text_key_distance;
70
+ })($ || ($ = {}));
71
+ //mol/text/key/distance/distance.ts
72
+ ;
73
+ "use strict";
74
+ var $;
75
+ (function ($) {
76
+ function $mol_text_distance(left, right) {
77
+ return $mol_text_key_distance($mol_text_key(left), $mol_text_key(right));
78
+ }
79
+ $.$mol_text_distance = $mol_text_distance;
80
+ })($ || ($ = {}));
81
+ //mol/text/distance/distance.ts
82
+ ;
83
+ export default $
84
+ //# sourceMappingURL=node.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../mam.jam.js","-","../../../../mam.ts","../../key/mol/text/key/key.ts","../../key/distance/mol/text/key/distance/distance.ts","../mol/text/distance/distance.ts"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACbA;AACA;AACA;AACA;;ACHA,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;AAK3B,IAAU,CAAC,CAMV;AAND,WAAU,CAAC;AAMX,CAAC,EANS,CAAC,KAAD,CAAC,QAMV;AAED,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;;;ADblB;AACA;AACA;;AEFA,IAAU,CAAC,CAaV;AAbD,WAAU,CAAC;IAEV,SAAgB,aAAa,CAAE,IAAY;QAC1C,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAA;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAA;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAG,CAAC,EAAG;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE,CAAA;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAE,OAAO,CAAE,IAAI,CAAC,CAAA;YACrC,GAAG,CAAC,GAAG,CAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAE,CAAA;SAC7B;QACD,OAAO,GAAG,CAAA;IACX,CAAC;IATe,eAAa,gBAS5B,CAAA;AAEF,CAAC,EAbS,CAAC,KAAD,CAAC,QAaV;;;;ACbD,IAAU,CAAC,CA2BV;AA3BD,WAAU,CAAC;IAEV,SAAgB,sBAAsB,CACrC,IAA2B,EAC3B,KAA4B;QAG5B,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;QACb,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;QAEd,KAAK,MAAM,CAAE,OAAO,EAAE,UAAU,CAAE,IAAI,IAAI,EAAG;YAC5C,KAAK,IAAI,UAAU,CAAA;YACnB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAE,OAAO,CAAE,IAAI,CAAC,CAAA;YAC7C,IAAI,IAAI,IAAI,CAAC,GAAG,CAAE,UAAU,GAAG,WAAW,CAAE,CAAA;SAC5C;QAED,KAAK,MAAM,CAAE,OAAO,EAAE,WAAW,CAAE,IAAI,KAAK,EAAG;YAC9C,KAAK,IAAI,WAAW,CAAA;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAE,OAAO,CAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,IAAI,IAAI,CAAC,GAAG,CAAE,UAAU,GAAG,WAAW,CAAE,CAAA;SAC5C;QAED,IAAI,IAAI,GAAG,CAAC;YAAG,OAAO,CAAC,CAAA;QAEvB,OAAO,IAAI,GAAG,KAAK,CAAA;IACpB,CAAC;IAvBe,wBAAsB,yBAuBrC,CAAA;AAEF,CAAC,EA3BS,CAAC,KAAD,CAAC,QA2BV;;;;AC3BD,IAAU,CAAC,CAYV;AAZD,WAAU,CAAC;IAEV,SAAgB,kBAAkB,CACjC,IAAY,EACZ,KAAa;QAEb,OAAO,sBAAsB,CAC5B,aAAa,CAAE,IAAI,CAAE,EACrB,aAAa,CAAE,KAAK,CAAE,CACtB,CAAA;IACF,CAAC;IARe,oBAAkB,qBAQjC,CAAA;AAEF,CAAC,EAZS,CAAC,KAAD,CAAC,QAYV;;;AJZD","file":"node.esm.js","sourcesContent":[null,null,"Error.stackTraceLimit = 50;\n\ndeclare let _$_: { new(): {} } & typeof globalThis\ndeclare class $ extends _$_ {}\n\nnamespace $ {\n\texport type $ = typeof $$\n\texport declare class $$ extends $ {}\n\tnamespace $$ {\n\t\texport type $$ = $\n\t}\n}\n\nmodule.exports = $\n","namespace $ {\n\t\n\texport function $mol_text_key( text: string ) {\n\t\ttext = '\\n\\n' + text + '\\r\\r'\n\t\tconst key = new Map< string, number >()\n\t\tfor( let i = 0; i < text.length - 2; ++ i ) {\n\t\t\tconst trigram = text.slice( i, i + 3 )\n\t\t\tconst count = key.get( trigram ) ?? 0\n\t\t\tkey.set( trigram, count + 1 )\n\t\t}\n\t\treturn key\n\t}\n\t\n}\n","namespace $ {\n\t\n\texport function $mol_text_key_distance(\n\t\tleft: Map< string, number >,\n\t\tright: Map< string, number >,\n\t) {\n\t\t\n\t\tlet dist = -4\n\t\tlet total = -4\n\t\t\n\t\tfor( const [ trigram, left_count ] of left ) {\n\t\t\ttotal += left_count\n\t\t\tconst right_count = right.get( trigram ) ?? 0\n\t\t\tdist += Math.abs( left_count - right_count )\n\t\t}\n\t\t\n\t\tfor( const [ trigram, right_count ] of right ) {\n\t\t\ttotal += right_count\n\t\t\tconst left_count = left.get( trigram ) ?? 0\n\t\t\tdist += Math.abs( left_count - right_count )\n\t\t}\n\t\t\n\t\tif( dist < 0 ) return 0\n\t\t\n\t\treturn dist / total\n\t}\n\t\n}\n","namespace $ {\n\t\n\texport function $mol_text_distance(\n\t\tleft: string,\n\t\tright: string,\n\t) {\n\t\treturn $mol_text_key_distance(\n\t\t\t$mol_text_key( left ),\n\t\t\t$mol_text_key( right ),\n\t\t)\n\t}\n\t\n}\n"]}
package/node.js ADDED
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var exports = void 0;
3
+ "use strict"
4
+
5
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ else for (var i = decorators.length - 1; i >= 0; i--) if ((d = decorators[i])) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ };
11
+
12
+ var globalThis = globalThis || ( typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this )
13
+ var $ = ( typeof module === 'object' ) ? ( module['export'+'s'] = globalThis ) : globalThis
14
+ $.$$ = $
15
+
16
+ ;
17
+
18
+ var $node = $node || {}
19
+ void function( module ) { var exports = module.exports = this; function require( id ) { return $node[ id.replace( /^.\// , "../" ) ] };
20
+ ;
21
+ "use strict";
22
+ Error.stackTraceLimit = 50;
23
+ var $;
24
+ (function ($) {
25
+ })($ || ($ = {}));
26
+ module.exports = $;
27
+ //mam.ts
28
+ ;
29
+
30
+ $node[ "../mam.ts" ] = $node[ "../mam.ts" ] = module.exports }.call( {} , {} )
31
+ ;
32
+ "use strict";
33
+ var $;
34
+ (function ($) {
35
+ function $mol_text_key(text) {
36
+ text = '\n\n' + text + '\r\r';
37
+ const key = new Map();
38
+ for (let i = 0; i < text.length - 2; ++i) {
39
+ const trigram = text.slice(i, i + 3);
40
+ const count = key.get(trigram) ?? 0;
41
+ key.set(trigram, count + 1);
42
+ }
43
+ return key;
44
+ }
45
+ $.$mol_text_key = $mol_text_key;
46
+ })($ || ($ = {}));
47
+ //mol/text/key/key.ts
48
+ ;
49
+ "use strict";
50
+ var $;
51
+ (function ($) {
52
+ function $mol_text_key_distance(left, right) {
53
+ let dist = -4;
54
+ let total = -4;
55
+ for (const [trigram, left_count] of left) {
56
+ total += left_count;
57
+ const right_count = right.get(trigram) ?? 0;
58
+ dist += Math.abs(left_count - right_count);
59
+ }
60
+ for (const [trigram, right_count] of right) {
61
+ total += right_count;
62
+ const left_count = left.get(trigram) ?? 0;
63
+ dist += Math.abs(left_count - right_count);
64
+ }
65
+ if (dist < 0)
66
+ return 0;
67
+ return dist / total;
68
+ }
69
+ $.$mol_text_key_distance = $mol_text_key_distance;
70
+ })($ || ($ = {}));
71
+ //mol/text/key/distance/distance.ts
72
+ ;
73
+ "use strict";
74
+ var $;
75
+ (function ($) {
76
+ function $mol_text_distance(left, right) {
77
+ return $mol_text_key_distance($mol_text_key(left), $mol_text_key(right));
78
+ }
79
+ $.$mol_text_distance = $mol_text_distance;
80
+ })($ || ($ = {}));
81
+ //mol/text/distance/distance.ts
82
+
83
+ //# sourceMappingURL=node.js.map
package/node.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../mam.jam.js","-","../../../../mam.ts","../../key/mol/text/key/key.ts","../../key/distance/mol/text/key/distance/distance.ts","../mol/text/distance/distance.ts"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACbA;AACA;AACA;AACA;;ACHA,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;AAK3B,IAAU,CAAC,CAMV;AAND,WAAU,CAAC;AAMX,CAAC,EANS,CAAC,KAAD,CAAC,QAMV;AAED,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;;;ADblB;AACA;AACA;;AEFA,IAAU,CAAC,CAaV;AAbD,WAAU,CAAC;IAEV,SAAgB,aAAa,CAAE,IAAY;QAC1C,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAA;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAA;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAG,CAAC,EAAG;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE,CAAA;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAE,OAAO,CAAE,IAAI,CAAC,CAAA;YACrC,GAAG,CAAC,GAAG,CAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAE,CAAA;SAC7B;QACD,OAAO,GAAG,CAAA;IACX,CAAC;IATe,eAAa,gBAS5B,CAAA;AAEF,CAAC,EAbS,CAAC,KAAD,CAAC,QAaV;;;;ACbD,IAAU,CAAC,CA2BV;AA3BD,WAAU,CAAC;IAEV,SAAgB,sBAAsB,CACrC,IAA2B,EAC3B,KAA4B;QAG5B,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;QACb,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;QAEd,KAAK,MAAM,CAAE,OAAO,EAAE,UAAU,CAAE,IAAI,IAAI,EAAG;YAC5C,KAAK,IAAI,UAAU,CAAA;YACnB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAE,OAAO,CAAE,IAAI,CAAC,CAAA;YAC7C,IAAI,IAAI,IAAI,CAAC,GAAG,CAAE,UAAU,GAAG,WAAW,CAAE,CAAA;SAC5C;QAED,KAAK,MAAM,CAAE,OAAO,EAAE,WAAW,CAAE,IAAI,KAAK,EAAG;YAC9C,KAAK,IAAI,WAAW,CAAA;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAE,OAAO,CAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,IAAI,IAAI,CAAC,GAAG,CAAE,UAAU,GAAG,WAAW,CAAE,CAAA;SAC5C;QAED,IAAI,IAAI,GAAG,CAAC;YAAG,OAAO,CAAC,CAAA;QAEvB,OAAO,IAAI,GAAG,KAAK,CAAA;IACpB,CAAC;IAvBe,wBAAsB,yBAuBrC,CAAA;AAEF,CAAC,EA3BS,CAAC,KAAD,CAAC,QA2BV;;;;AC3BD,IAAU,CAAC,CAYV;AAZD,WAAU,CAAC;IAEV,SAAgB,kBAAkB,CACjC,IAAY,EACZ,KAAa;QAEb,OAAO,sBAAsB,CAC5B,aAAa,CAAE,IAAI,CAAE,EACrB,aAAa,CAAE,KAAK,CAAE,CACtB,CAAA;IACF,CAAC;IARe,oBAAkB,qBAQjC,CAAA;AAEF,CAAC,EAZS,CAAC,KAAD,CAAC,QAYV;;","file":"node.js","sourcesContent":[null,null,"Error.stackTraceLimit = 50;\n\ndeclare let _$_: { new(): {} } & typeof globalThis\ndeclare class $ extends _$_ {}\n\nnamespace $ {\n\texport type $ = typeof $$\n\texport declare class $$ extends $ {}\n\tnamespace $$ {\n\t\texport type $$ = $\n\t}\n}\n\nmodule.exports = $\n","namespace $ {\n\t\n\texport function $mol_text_key( text: string ) {\n\t\ttext = '\\n\\n' + text + '\\r\\r'\n\t\tconst key = new Map< string, number >()\n\t\tfor( let i = 0; i < text.length - 2; ++ i ) {\n\t\t\tconst trigram = text.slice( i, i + 3 )\n\t\t\tconst count = key.get( trigram ) ?? 0\n\t\t\tkey.set( trigram, count + 1 )\n\t\t}\n\t\treturn key\n\t}\n\t\n}\n","namespace $ {\n\t\n\texport function $mol_text_key_distance(\n\t\tleft: Map< string, number >,\n\t\tright: Map< string, number >,\n\t) {\n\t\t\n\t\tlet dist = -4\n\t\tlet total = -4\n\t\t\n\t\tfor( const [ trigram, left_count ] of left ) {\n\t\t\ttotal += left_count\n\t\t\tconst right_count = right.get( trigram ) ?? 0\n\t\t\tdist += Math.abs( left_count - right_count )\n\t\t}\n\t\t\n\t\tfor( const [ trigram, right_count ] of right ) {\n\t\t\ttotal += right_count\n\t\t\tconst left_count = left.get( trigram ) ?? 0\n\t\t\tdist += Math.abs( left_count - right_count )\n\t\t}\n\t\t\n\t\tif( dist < 0 ) return 0\n\t\t\n\t\treturn dist / total\n\t}\n\t\n}\n","namespace $ {\n\t\n\texport function $mol_text_distance(\n\t\tleft: string,\n\t\tright: string,\n\t) {\n\t\treturn $mol_text_key_distance(\n\t\t\t$mol_text_key( left ),\n\t\t\t$mol_text_key( right ),\n\t\t)\n\t}\n\t\n}\n"]}