@ezez/utils 4.6.0 → 4.7.0

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.
Files changed (125) hide show
  1. package/.github/workflows/docs.yml +4 -3
  2. package/CHANGELOG.md +7 -0
  3. package/README.md +19 -6
  4. package/dist/assertProps.d.ts +6 -0
  5. package/dist/assertProps.d.ts.map +1 -0
  6. package/dist/assertProps.js +11 -0
  7. package/dist/assertProps.js.map +1 -0
  8. package/dist/hasProps.d.ts +3 -0
  9. package/dist/hasProps.d.ts.map +1 -0
  10. package/dist/hasProps.js +16 -0
  11. package/dist/hasProps.js.map +1 -0
  12. package/dist/match.d.ts.map +1 -1
  13. package/dist/match.js.map +1 -1
  14. package/docs/assets/navigation.js +1 -1
  15. package/docs/documents/Changelog.html +71 -64
  16. package/docs/functions/index.cap.html +2 -2
  17. package/docs/functions/index.capitalize.html +2 -2
  18. package/docs/functions/index.coalesce.html +2 -2
  19. package/docs/functions/index.compareArrays.html +2 -2
  20. package/docs/functions/index.compareProps.html +2 -2
  21. package/docs/functions/index.deserialize.html +2 -2
  22. package/docs/functions/index.ensureArray.html +2 -2
  23. package/docs/functions/index.ensureDate.html +2 -2
  24. package/docs/functions/index.ensureError.html +2 -2
  25. package/docs/functions/index.ensurePrefix.html +2 -2
  26. package/docs/functions/index.ensureSuffix.html +2 -2
  27. package/docs/functions/index.ensureTimestamp.html +2 -2
  28. package/docs/functions/index.escapeRegExp.html +2 -2
  29. package/docs/functions/index.formatDate.html +2 -2
  30. package/docs/functions/index.get.html +2 -2
  31. package/docs/functions/index.getMultiple.html +2 -2
  32. package/docs/functions/index.ignore.html +2 -2
  33. package/docs/functions/index.insertSeparator.html +2 -2
  34. package/docs/functions/index.isEmpty.html +2 -2
  35. package/docs/functions/index.isNumericString.html +2 -2
  36. package/docs/functions/index.isPlainObject.html +2 -2
  37. package/docs/functions/index.last.html +2 -2
  38. package/docs/functions/index.later-1.html +2 -2
  39. package/docs/functions/index.mapAsync.html +2 -2
  40. package/docs/functions/index.mapValues.html +2 -2
  41. package/docs/functions/index.match.html +6 -3
  42. package/docs/functions/index.memoize.html +2 -2
  43. package/docs/functions/index.merge.html +2 -2
  44. package/docs/functions/index.mostFrequent.html +2 -2
  45. package/docs/functions/index.noop.html +2 -2
  46. package/docs/functions/index.occurrences.html +2 -2
  47. package/docs/functions/index.omit.html +2 -2
  48. package/docs/functions/index.pick.html +2 -2
  49. package/docs/functions/index.pull.html +2 -2
  50. package/docs/functions/index.race.html +2 -2
  51. package/docs/functions/index.remove.html +2 -2
  52. package/docs/functions/index.removeCommonProperties.html +2 -2
  53. package/docs/functions/index.replace.html +2 -2
  54. package/docs/functions/index.replaceDeep.html +2 -2
  55. package/docs/functions/index.rethrow.html +2 -2
  56. package/docs/functions/index.retry.html +2 -2
  57. package/docs/functions/index.round.html +2 -2
  58. package/docs/functions/index.safe.html +2 -2
  59. package/docs/functions/index.sample.html +2 -2
  60. package/docs/functions/index.samples.html +2 -2
  61. package/docs/functions/index.scale.html +2 -2
  62. package/docs/functions/index.seq.html +2 -2
  63. package/docs/functions/index.seqEarlyBreak.html +2 -2
  64. package/docs/functions/index.serialize.html +2 -2
  65. package/docs/functions/index.serializeToBuffer.html +2 -2
  66. package/docs/functions/index.set.html +2 -2
  67. package/docs/functions/index.setImmutable.html +2 -2
  68. package/docs/functions/index.shuffle.html +2 -2
  69. package/docs/functions/index.sortBy.html +2 -2
  70. package/docs/functions/index.sortByMultiple.html +2 -2
  71. package/docs/functions/index.sortProps.html +2 -2
  72. package/docs/functions/index.stripPrefix.html +2 -2
  73. package/docs/functions/index.stripSuffix.html +2 -2
  74. package/docs/functions/index.throttle.html +2 -2
  75. package/docs/functions/index.toggle.html +2 -2
  76. package/docs/functions/index.trim.html +2 -2
  77. package/docs/functions/index.trimEnd.html +2 -2
  78. package/docs/functions/index.trimStart.html +2 -2
  79. package/docs/functions/index.truthy.html +2 -2
  80. package/docs/functions/index.unique.html +2 -2
  81. package/docs/functions/index.unserializeFromBuffer.html +2 -2
  82. package/docs/functions/index.wait.html +2 -2
  83. package/docs/functions/index.waitFor.html +2 -2
  84. package/docs/functions/index.waitSync.html +2 -2
  85. package/docs/index.html +21 -8
  86. package/docs/interfaces/index.ComparePropsOptions.html +3 -3
  87. package/docs/interfaces/index.GetMultipleSource.html +2 -2
  88. package/docs/interfaces/index.GetSource.html +2 -2
  89. package/docs/interfaces/index.IsNumericStringOptions.html +2 -2
  90. package/docs/interfaces/index.OccurencesOptions.html +2 -2
  91. package/docs/interfaces/index.SetImmutableSource.html +2 -2
  92. package/docs/interfaces/index.SetSource.html +2 -2
  93. package/docs/interfaces/index.ThrottleOptions.html +3 -3
  94. package/docs/interfaces/index.ThrottledFunctionExtras.html +3 -3
  95. package/docs/modules/index.html +1 -1
  96. package/docs/modules.html +1 -1
  97. package/docs/types/index.CustomDeserializers.html +1 -1
  98. package/docs/types/index.CustomSerializers.html +1 -1
  99. package/docs/types/index.Later.html +2 -2
  100. package/docs/types/index.MapValuesFn.html +2 -2
  101. package/docs/types/index.MatchCallback.html +1 -1
  102. package/docs/types/index.MergeTwo.html +2 -2
  103. package/docs/types/index.SeqEarlyBreaker.html +2 -2
  104. package/docs/types/index.SeqFn.html +2 -2
  105. package/docs/types/index.SeqFunctions.html +2 -2
  106. package/docs/types/index.SetImmutablePath.html +2 -2
  107. package/docs/types/index.ThrottledFunction.html +1 -1
  108. package/docs/variables/index.mapValuesUNSET.html +2 -2
  109. package/docs/variables/index.mergeUNSET.html +2 -2
  110. package/esm/assertProps.d.ts +6 -0
  111. package/esm/assertProps.d.ts.map +1 -0
  112. package/esm/assertProps.js +8 -0
  113. package/esm/assertProps.js.map +1 -0
  114. package/esm/hasProps.d.ts +3 -0
  115. package/esm/hasProps.d.ts.map +1 -0
  116. package/esm/hasProps.js +13 -0
  117. package/esm/hasProps.js.map +1 -0
  118. package/esm/match.d.ts.map +1 -1
  119. package/esm/match.js.map +1 -1
  120. package/package.json +1 -1
  121. package/src/assertProps.spec.ts +128 -0
  122. package/src/assertProps.ts +37 -0
  123. package/src/hasProps.spec.ts +122 -0
  124. package/src/hasProps.ts +36 -0
  125. package/src/match.ts +1 -0
@@ -29,22 +29,23 @@ jobs:
29
29
 
30
30
  - name: Deploy versioned documentation
31
31
  uses: easingthemes/ssh-deploy@main
32
- env:
32
+ with:
33
33
  SSH_PRIVATE_KEY: ${{ secrets.DOCS_SERVER_PRIVATE_KEY }}
34
34
  REMOTE_HOST: ${{ secrets.DOCS_SERVER_HOST }}
35
35
  REMOTE_USER: ${{ secrets.DOCS_SERVER_USER }}
36
36
  REMOTE_PORT: ${{ secrets.DOCS_SERVER_PORT }}
37
37
  SOURCE: "docs/"
38
38
  TARGET: "/docs/${{ env.PROJECT_NAME }}/${{ env.APP_VERSION }}"
39
+ ARGS: "-rltgoDzvO"
39
40
 
40
41
  - name: Deploy latest documentation
41
42
  uses: easingthemes/ssh-deploy@main
42
- env:
43
+ with:
43
44
  SSH_PRIVATE_KEY: ${{ secrets.DOCS_SERVER_PRIVATE_KEY }}
44
45
  REMOTE_HOST: ${{ secrets.DOCS_SERVER_HOST }}
45
46
  REMOTE_USER: ${{ secrets.DOCS_SERVER_USER }}
46
47
  REMOTE_PORT: ${{ secrets.DOCS_SERVER_PORT }}
47
- ARGS: "-rlgoDzvc -i --delete"
48
+ ARGS: "-rlgoDzv --delete"
48
49
  SOURCE: "docs/"
49
50
  TARGET: "/docs/${{ env.PROJECT_NAME }}/latest"
50
51
 
package/CHANGELOG.md CHANGED
@@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
6
6
  ## [UNRELEASED]
7
7
  - (nothing yet)
8
8
 
9
+ ## [4.7.0] - 2025-10-16
10
+ ### Added
11
+ - `hasProps` method
12
+ - `assertProps` method
13
+ ### Changed
14
+ - deprecated `match`
15
+
9
16
  ## [4.6.0] - 2025-10-10
10
17
  ### Added
11
18
  - `ignore` method
package/README.md CHANGED
@@ -30,14 +30,17 @@ object, with just some properties copied. Easy, right? Few lines of code? Lodash
30
30
  ## Supported methods
31
31
 
32
32
  ### String related
33
- - `addPrefix` - add prefix to a string if not already present
34
- - `addSuffix` - add suffix to a string if not already present
35
33
  - `capitalize` - capitalize a string, optionally lower casing the rest
34
+ - `ensurePrefix` - add prefix to a string if not already present
35
+ - `ensureSuffix` - add suffix to a string if not already present
36
36
  - `isNumericString` - check if given value is a numeric string, features configurable
37
37
  - `occurrences` - count occurrences of a substring in a string, optionally allow overlapping
38
38
  - `replace` - replace all occurrences of a substring using a map of replacements
39
39
  - `stripPrefix` - strip prefix from a string
40
40
  - `stripSuffix` - strip suffix from a string
41
+ - `trim` - remove given characters from both sides of a string
42
+ - `trimEnd` - remove given characters from the end of a string
43
+ - `trimStart` - remove given characters from the start of a string
41
44
 
42
45
  ### Number related
43
46
  - `cap` - cap a value between lower and upper bound
@@ -53,7 +56,12 @@ object, with just some properties copied. Easy, right? Few lines of code? Lodash
53
56
  - `mostFrequent` - find most frequent value in an array
54
57
  - `pull` - remove values from an array (by mutating)
55
58
  - `remove` - remove values from an array (by mutating) using predicate function and return removed values
59
+ - `sample` - pick a random element from an array
60
+ - `samples` - pick multiple random elements from an array without duplicates
61
+ - `shuffle` - shuffle an array, returning a new array
56
62
  - `sortBy` - sort an array by given property (create callback function for `Array.prototype.sort`)
63
+ - `sortByMultiple` - sort an array by multiple properties with individual sort directions
64
+ - `toggle` - toggle an item in an array (add if missing, remove if present)
57
65
  - `unique` - get unique values from an array
58
66
 
59
67
  ### Object related
@@ -64,9 +72,11 @@ object, with just some properties copied. Easy, right? Few lines of code? Lodash
64
72
  - `merge` - merge two objects shallowly, allowing to remove properties while doing so
65
73
  - `omit` - omit properties from an object
66
74
  - `pick` - pick some properties from an object
75
+ - `removeCommonProperties` - remove properties from targets that have the same value as in source
67
76
  - `replaceDeep` - recursively replace all occurrences of a value in an object/array
68
- - `sortProps` - sort object properties by key
77
+ - `replaceDeepByFn` - recursively replace values in an object/array using a callback function
69
78
  - `serialize` - like JSON.stringify but any data type is allowed
79
+ - `sortProps` - sort object properties by key
70
80
 
71
81
  ### Date related
72
82
  - `ensureDate` - ensure that given value is a Date instance
@@ -80,22 +90,25 @@ object, with just some properties copied. Easy, right? Few lines of code? Lodash
80
90
  - `safe` - runs function and returns its result or default value if function throws an error
81
91
 
82
92
  ### Flow related
93
+ - `ignore` - execute a callback and ignore its result, errors, or promise rejections
83
94
  - `later` - create a promise you can resolve later, outside of Promise constructor
84
95
  - `mapAsync` - map an array asynchronously if sync version blocks your event loop for too long
85
96
  - `noop` - do nothing
97
+ - `race` - timeout your promises while keeping TypeScript types correct
86
98
  - `rethrow` - throw given value
87
- - `seq` - sequentially execute Promise-returning functions until one returns a value
88
99
  - `retry` - execute Promise-returning in a loop until it resolves
100
+ - `seq` - sequentially execute Promise-returning functions until one returns a value
89
101
  - `wait` - wait given amount of time (async)
90
- - `waitSync` - wait given amount of time (sync)
91
102
  - `waitFor` - wait for a condition to be true, checking every given amount of time
103
+ - `waitSync` - wait given amount of time (sync)
92
104
 
93
105
  ### Various
94
106
  - `get` - extract a value from a deep object using specified path, optionally with a default value
95
107
  - `getMultiple` - same as above, but test multiple paths
108
+ - `isEmpty` - check if given value is empty
109
+ - `memoize` - memoize a function, caching the result of the last call
96
110
  - `set` - set a value in a deep object using specified path
97
111
  - `setImmutable` - set a value in a deep object using specified path, but return a new object
98
- - `isEmpty` - check if given value is empty
99
112
  - `throttle` - throttle a function, very configurable
100
113
  - `truthy` - is value truthy? (useful for filtering with more correct TypeScript support than `filter(Boolean)`)
101
114
 
@@ -0,0 +1,6 @@
1
+ type AssertPropsFn = <T extends Record<string, "string" | "number" | "boolean">>(obj: unknown, schema: T) => asserts obj is {
2
+ [K in keyof T]: T[K] extends "string" ? string : T[K] extends "number" ? number : T[K] extends "boolean" ? boolean : never;
3
+ };
4
+ declare const assertProps: AssertPropsFn;
5
+ export { assertProps, };
6
+ //# sourceMappingURL=assertProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertProps.d.ts","sourceRoot":"","sources":["../src/assertProps.ts"],"names":[],"mappings":"AAEA,KAAK,aAAa,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,EAC3E,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,CAAC,KACR,OAAO,CAAC,GAAG,IAAI;KACf,CAAC,IAAI,MAAM,CAAC,GACb,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,GACxB,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,GAC1B,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,OAAO,GAC5B,KAAK;CACtB,CAAC;AAcF,QAAA,MAAM,WAAW,EAAE,aAOlB,CAAC;AAEF,OAAO,EACH,WAAW,GACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertProps = void 0;
4
+ const hasProps_1 = require("./hasProps");
5
+ const assertProps = (obj, schema) => {
6
+ if (!(0, hasProps_1.hasProps)(obj, schema)) {
7
+ throw new Error("Object does not match the required schema");
8
+ }
9
+ };
10
+ exports.assertProps = assertProps;
11
+ //# sourceMappingURL=assertProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertProps.js","sourceRoot":"","sources":["../src/assertProps.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAyBtC,MAAM,WAAW,GAAkB,CAC/B,GAAY,EACZ,MAAS,EACX,EAAE;IACA,IAAI,CAAC,IAAA,mBAAQ,EAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACjE,CAAC;AACL,CAAC,CAAC;AAGE,kCAAW"}
@@ -0,0 +1,3 @@
1
+ declare const hasProps: <T extends Record<string, "string" | "number" | "boolean">>(obj: unknown, schema: T) => obj is { [K in keyof T]: T[K] extends "string" ? string : T[K] extends "number" ? number : T[K] extends "boolean" ? boolean : never; };
2
+ export { hasProps, };
3
+ //# sourceMappingURL=hasProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasProps.d.ts","sourceRoot":"","sources":["../src/hasProps.ts"],"names":[],"mappings":"AAaA,QAAA,MAAM,QAAQ,GACV,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,EAEzD,KAAK,OAAO,EACZ,QAAQ,CAAC,KACV,GAAG,IAAI,GACL,CAAC,IAAI,MAAM,CAAC,GACb,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,GACxB,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,GAC1B,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,OAAO,GAC5B,KAAK,GAQtB,CAAC;AAEF,OAAO,EACH,QAAQ,GACX,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasProps = void 0;
4
+ const hasProps = (obj, schema) => {
5
+ if (typeof obj !== "object" || obj === null || Array.isArray(obj)) {
6
+ return false;
7
+ }
8
+ for (const [key, type] of Object.entries(schema)) {
9
+ if (typeof obj[key] !== type) {
10
+ return false;
11
+ }
12
+ }
13
+ return true;
14
+ };
15
+ exports.hasProps = hasProps;
16
+ //# sourceMappingURL=hasProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasProps.js","sourceRoot":"","sources":["../src/hasProps.ts"],"names":[],"mappings":";;;AAaA,MAAM,QAAQ,GAAG,CAGb,GAAY,EACZ,MAAS,EAOX,EAAE;IACA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IACpF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAE/C,IAAI,OAAQ,GAA0B,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAGE,4BAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;AAO9C,QAAA,MAAM,KAAK,GAAI,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,aAAa,CAAC,CAAC,CAAC,KAAG;IAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,CAAC,EAAE,CAAA;CAejF,CAAC;AAEF,OAAO,EACH,KAAK,GACR,CAAC;AACF,YAAY,EACR,aAAa,GAChB,CAAC"}
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;AAQ9C,QAAA,MAAM,KAAK,GAAI,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,aAAa,CAAC,CAAC,CAAC,KAAG;IAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,CAAC,EAAE,CAAA;CAejF,CAAC;AAEF,OAAO,EACH,KAAK,GACR,CAAC;AACF,YAAY,EACR,aAAa,GAChB,CAAC"}
package/dist/match.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"match.js","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":";;;AAOA,MAAM,KAAK,GAAG,CAAI,IAAS,EAAE,EAAoB,EAAoC,EAAE;IACnF,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAChB,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,OAAO;QACP,SAAS;KACZ,CAAC;AACN,CAAC,CAAC;AAGE,sBAAK"}
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":";;;AAQA,MAAM,KAAK,GAAG,CAAI,IAAS,EAAE,EAAoB,EAAoC,EAAE;IACnF,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAChB,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,OAAO;QACP,SAAS;KACZ,CAAC;AACN,CAAC,CAAC;AAGE,sBAAK"}
@@ -1 +1 @@
1
- window.navigationData = "eJyNmc1y0zAUhd/FbAu0tJTSHW0ThhmgHRzYMCwUR3FELcuVZJrC9N25/ol/4vhcb32/88WWJfmq/fkv8HLrg8vgeiPSWCYmDo6CTPgNXVqZKNcy9e51U3y18Toh4l6lq+Dy4vTi4vz44vmosdBluW0N2qzyRLrX5eV+9s1REG1UsrIyDS5/trdhdCasvLMmc7eZVyZ1rU6lXtq1iBrjAXrvV96ed+7uo/Rf8sSrLJGhyW0kgXrAMuIpQl70yX2lIbcqCr1VacyPwOEA+onbKMpp0EnB2wcsEofSf9I692I5YXiHMKOeYuRFi4013idyNc/TqHii2dZbgYZgJDHlR/jx3SOR9Dp33ugb6ehli0T9lbYj9k9ZuyaG4J73+P27k7dvBu5wmjmc7v0s6HkPu8oSl/8ish8iyaWbp4ctHYB3+WhzLZJkKaL7MVsHYX3SxnLxaEZUdZWzhPJhJmzydGWluB8bqz1ognNsvMrSlHw910cmQpfgbe1CvytUI8Y+xVkHq/KwdoBxXr2bUN+/hrNFK/0jaNIv209Zn+tbT3vCYiJwsoYBokhkrWG9G/3aQMV+9PysH1W+XLLQUDNIZATddYQ0NQEl5Tf7g7XiySFTB+N1ZQvA2koKyFbtrjnu6kBAJVOX17c/rupArOqGdkzOVDCsaGatsZyphFjVnZVrteVcFcXKwnw9QVZRrGyhtHReaLBo9kCkdLQ85DcZz7bI16GAbG2sFh6/zZYBolj6cQMVcXTX3ELFDgIqFafGAktVR4KUlpMPJa1P4dHE3AOR0s105sG6q4F9BR1JEuFcuRFkVkY0/qug5+0128jfA+Gt3iVCpbfL3zICr7OHAR3dPrAUVRjutWvDNJVfngABfRU/uKc0GnfsCCypPq3QUiFQQ80cUlAZxaU28CtQA1BBn3UkoDKKG+fnVj7kdAIHlg4FZKkxYOcqqiBsilNgdQwcd3QgpNIKPExRBeFMdTv3/XBRReE8SUCYqiBsBWp6iioK00z5g+JlnRVcG61NWnQwtAsq9CoO8/AHsgQ/YQXwihspwTzrQFDlqW1/RJoSwAoLtv+yjOImp2vj8aIM4k6swVgWVRjW8Ktc1VkBmB41gBSRgLdQlFFcPoCwfMDR9qgLJS0GdWw3P6WXb5iFuaL2E30kByjUgr3QwQbOdc7L0NFQSLahO4WeCkAKY/0VWHFVnRXwTWmfY4TMobBBkIYauIw75nQgTsUdcjoQUPn67xrjnh2BJCaOoaKsI4FVGsSpyoRnaJetAUYRemHBKmoQqMn9Bszdqg4Eeaqo/xoXVHUoaLaNuTWa22MO4kD/KFDTVVSZ8Bwdy2qAUYTwWLAjpv1p5tAYDf/T9KKTWFNiuUtU8rOT92enxyNvAXr7XN/26/nXf0rpcaE="
1
+ window.navigationData = "eJyVmUtz0zAURv+L2RZoaSmlO9omDDNAOziwYVgojuKIWpYryTSF4b9z/Ygfcfxds/U934ks69l+/xN4ufXBZXC9EWksExMHR0Em/IYerUyUa5l697Ipvth4nRBxr9JVcHlxenFxfnzx96ix0GO5bQ3arPJEupfl43721VEQbVSysjINLr+3zTA6E1beWZO528wrk7pWp1Iv7VpEjfEAvfcrr887rXsv/ac88SpLZGhyG0mgHrCMeIqQF31wn6nLrYpCb1Ua8z1wOIB+4jaKcup0UvD2AYvEofQftM69WE7o3iHMqKcYedFiY433iVzN8zQq3mi29VagLhhJTPkRvn/3SCS9zp03+kY6+tgiUb+l7Yj9U9bOiSG45z1+++bk9auBO5xmDqd7Pwp638OussTlP4nsm0hy6ebpYUsH4F0+2lyLJFmK6H7M1kFYn7SxXDyaEVVd5SyhfJgJmzxdWSnux/pqD5rgHOuvsjQlX4/1kYHQJXhbO9HvCtWIsU9x1sGsPKwdYJxX7wbU18/hbNFKfwka9Mt2K+tzfetpT1gMBE7WMEAUiaw1rHe9Xxuo2I+en/WjypdTFhpqBomMoFZHSFMTUFLu2e+sFU8OmToYryuPAKytpIBs1a6a464OBFQydXnd/HFVB2JVN7RicqaCYUUza43lTCXEqu6sXKst56ooVhbm6wmyimJlC6Wl80KDSbMHIqWj6SG/yHi2Rb4OBWRrY7Xw+Gu2DBDF0o8bqIiju8MtVOwgoFJxaiywVHUkSGk6+VDS/BQeDcw9ECndTGcezLsa2FfQlSQRzpULQWZlRP2/Cnre3mEb+XsgbOpdIlR6u/wpI/A5exjQUfOBpajCcO+4NkxT+fkJENCu+M49pdG4Y0dgSbW1QkuFQA0d5pCCyv/7/bXUBm4NNYCaVez1SEBlFDfOz618yOlaDiwdCshSY8ByVlRB2BRXw+puOO7oQEilFXiZogrCmeoe5/fDRRWF8yQBYaqCsBXoJFRUUZhGyi8UL+us4NpobdLiWENLo0Kf4jAPfyBL8BtWAK+4kRKMsw4EVZ7O8o9IUwJYYcGeUJZR3OT0bDxelEHciTXoy6IKwxpu1VWdFYDhUQNIEQnYhKKM4vIBhOUDjrb3XyhpMahjj/hTDvgNszBXdCZFO+cAhVqwFjp4qnOdSzR0NBSSbail0FMBSGGsvwIzrqqzAv6k2ucYIXNTbBCkoVNdxt19OhCn4m4+HQiofP3HjnHPjkASE8dQUdaRwCoN4lRlwjO0ytYAowi9sGAWNQjU5H4Dxm5VB4I8VXT+GhdUdSholo25NZpbYw7iQP8o0KGrqDLhObqr1QCjCOFdYUdM+3vNoT4a/vvpWSexpsRyl6jkZydvz06PR74C9Pa5vu3H3x//AKXPeLY="