diff options
Diffstat (limited to 'users/gordon/gordon.c')
-rw-r--r-- | users/gordon/gordon.c | 241 |
1 files changed, 188 insertions, 53 deletions
diff --git a/users/gordon/gordon.c b/users/gordon/gordon.c index 056012a21..3115e1c32 100644 --- a/users/gordon/gordon.c +++ b/users/gordon/gordon.c | |||
@@ -15,20 +15,17 @@ const char secret[][64] = { | |||
15 | }; | 15 | }; |
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | |||
19 | |||
20 | |||
21 | void register_hyper (void) { //Helper function to invoke Hyper | 18 | void register_hyper (void) { //Helper function to invoke Hyper |
22 | register_code (KC_LSFT); | 19 | register_code (KC_LSFT); |
23 | register_code (KC_LCTL); | 20 | register_code (KC_LCTL); |
24 | register_code (KC_LALT); | 21 | register_code (KC_LALT); |
25 | register_code (KC_LGUI); | 22 | register_code (KC_LGUI); |
26 | } | 23 | } |
27 | void unregister_hyper (void) { //Helper function to invoke Hyper | 24 | void unregister_hyper (void) { //Helper function to invoke Hyper |
28 | unregister_code (KC_LSFT); | 25 | unregister_code (KC_LSFT); |
29 | unregister_code (KC_LCTL); | 26 | unregister_code (KC_LCTL); |
30 | unregister_code (KC_LALT); | 27 | unregister_code (KC_LALT); |
31 | unregister_code (KC_LGUI); | 28 | unregister_code (KC_LGUI); |
32 | } | 29 | } |
33 | 30 | ||
34 | void register_ctrl_a (void) { | 31 | void register_ctrl_a (void) { |
@@ -41,55 +38,55 @@ void unregister_ctrl_a (void) { | |||
41 | unregister_code(KC_A); | 38 | unregister_code(KC_A); |
42 | } | 39 | } |
43 | 40 | ||
44 | void register_alt_f7 (void) { | 41 | void register_alt_f7 (void) { |
45 | register_code (KC_LALT); | 42 | register_code (KC_LALT); |
46 | register_code (KC_F7); | 43 | register_code (KC_F7); |
47 | } | 44 | } |
48 | 45 | ||
49 | void unregister_alt_f7 (void) { | 46 | void unregister_alt_f7 (void) { |
50 | unregister_code (KC_LALT); | 47 | unregister_code (KC_LALT); |
51 | unregister_code (KC_F7); | 48 | unregister_code (KC_F7); |
52 | } | 49 | } |
53 | 50 | ||
54 | void register_shift_f6 (void) { | 51 | void register_shift_f6 (void) { |
55 | register_code (KC_LSFT); | 52 | register_code (KC_LSFT); |
56 | register_code (KC_F6); | 53 | register_code (KC_F6); |
57 | } | 54 | } |
58 | 55 | ||
59 | void unregister_shift_f6 (void) { | 56 | void unregister_shift_f6 (void) { |
60 | unregister_code (KC_LSFT); | 57 | unregister_code (KC_LSFT); |
61 | unregister_code (KC_F6); | 58 | unregister_code (KC_F6); |
62 | } | 59 | } |
63 | 60 | ||
64 | void register_ctrl_shift (void) { | 61 | void register_ctrl_shift (void) { |
65 | register_code (KC_LSFT); | 62 | register_code (KC_LSFT); |
66 | register_code (KC_LCTRL); | 63 | register_code (KC_LCTRL); |
67 | } | 64 | } |
68 | 65 | ||
69 | void unregister_ctrl_shift (void) { | 66 | void unregister_ctrl_shift (void) { |
70 | unregister_code (KC_LSFT); | 67 | unregister_code (KC_LSFT); |
71 | unregister_code (KC_LCTRL); | 68 | unregister_code (KC_LCTRL); |
72 | } | 69 | } |
73 | 70 | ||
74 | void register_alt_shift (void) { | 71 | void register_alt_shift (void) { |
75 | register_code (KC_LSFT); | 72 | register_code (KC_LSFT); |
76 | register_code (KC_LALT); | 73 | register_code (KC_LALT); |
77 | } | 74 | } |
78 | 75 | ||
79 | void unregister_alt_shift (void) { | 76 | void unregister_alt_shift (void) { |
80 | unregister_code (KC_LSFT); | 77 | unregister_code (KC_LSFT); |
81 | unregister_code (KC_LALT); | 78 | unregister_code (KC_LALT); |
82 | } | 79 | } |
83 | 80 | ||
84 | // To activate SINGLE_HOLD, you will need to hold for 200ms first. | 81 | // To activate SINGLE_HOLD, you will need to hold for 200ms first. |
85 | // This tap dance favors keys that are used frequently in typing like 'f' | 82 | // This tap dance favors keys that are used frequently in typing like 'f' |
86 | int cur_dance (qk_tap_dance_state_t *state) { | 83 | int cur_dance (qk_tap_dance_state_t *state) { |
87 | if (state->count == 1) { | 84 | if (state->count == 1) { |
88 | //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP | 85 | //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP |
89 | if (state->interrupted) { | 86 | if (state->interrupted) { |
90 | // if (!state->pressed) return SINGLE_TAP; | 87 | // if (!state->pressed) return SINGLE_TAP; |
91 | //need "permissive hold" here. | 88 | //need "permissive hold" here. |
92 | // else return SINsGLE_HOLD; | 89 | // else return SINsGLE_HOLD; |
93 | //If the interrupting key is released before the tap-dance key, then it is a single HOLD | 90 | //If the interrupting key is released before the tap-dance key, then it is a single HOLD |
94 | //However, if the tap-dance key is released first, then it is a single TAP | 91 | //However, if the tap-dance key is released first, then it is a single TAP |
95 | //But how to get access to the state of the interrupting key???? | 92 | //But how to get access to the state of the interrupting key???? |
@@ -105,8 +102,8 @@ int cur_dance (qk_tap_dance_state_t *state) { | |||
105 | else if (state->count == 2) { | 102 | else if (state->count == 2) { |
106 | if (state->interrupted) return DOUBLE_SINGLE_TAP; | 103 | if (state->interrupted) return DOUBLE_SINGLE_TAP; |
107 | else if (state->pressed) return DOUBLE_HOLD; | 104 | else if (state->pressed) return DOUBLE_HOLD; |
108 | else return DOUBLE_TAP; | 105 | else return DOUBLE_TAP; |
109 | } | 106 | } |
110 | else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP; | 107 | else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP; |
111 | else if (state->count == 3) return TRIPLE_HOLD; | 108 | else if (state->count == 3) return TRIPLE_HOLD; |
112 | else return 8; //magic number. At some point this method will expand to work for more presses | 109 | else return 8; //magic number. At some point this method will expand to work for more presses |
@@ -116,8 +113,8 @@ int cur_dance (qk_tap_dance_state_t *state) { | |||
116 | int hold_cur_dance (qk_tap_dance_state_t *state) { | 113 | int hold_cur_dance (qk_tap_dance_state_t *state) { |
117 | if (state->count == 1) { | 114 | if (state->count == 1) { |
118 | if (state->interrupted) { | 115 | if (state->interrupted) { |
119 | if (!state->pressed) return SINGLE_TAP; | 116 | if (!state->pressed) return SINGLE_TAP; |
120 | else return SINGLE_HOLD; | 117 | else return SINGLE_HOLD; |
121 | } | 118 | } |
122 | else { | 119 | else { |
123 | if (!state->pressed) return SINGLE_TAP; | 120 | if (!state->pressed) return SINGLE_TAP; |
@@ -128,8 +125,8 @@ int hold_cur_dance (qk_tap_dance_state_t *state) { | |||
128 | //with single tap. | 125 | //with single tap. |
129 | else if (state->count == 2) { | 126 | else if (state->count == 2) { |
130 | if (state->pressed) return DOUBLE_HOLD; | 127 | if (state->pressed) return DOUBLE_HOLD; |
131 | else return DOUBLE_TAP; | 128 | else return DOUBLE_TAP; |
132 | } | 129 | } |
133 | else if (state->count == 3) { | 130 | else if (state->count == 3) { |
134 | if (!state->pressed) return TRIPLE_TAP; | 131 | if (!state->pressed) return TRIPLE_TAP; |
135 | else return TRIPLE_HOLD; | 132 | else return TRIPLE_HOLD; |
@@ -138,7 +135,7 @@ int hold_cur_dance (qk_tap_dance_state_t *state) { | |||
138 | } | 135 | } |
139 | 136 | ||
140 | 137 | ||
141 | static xtap htap_state = { | 138 | static xtap htap_state = { |
142 | .is_press_action = true, | 139 | .is_press_action = true, |
143 | .state = 0 | 140 | .state = 0 |
144 | }; | 141 | }; |
@@ -168,7 +165,7 @@ void h_reset (qk_tap_dance_state_t *state, void *user_data) { | |||
168 | 165 | ||
169 | /**************** QUAD FUNCTION FOR TAB ****************/ | 166 | /**************** QUAD FUNCTION FOR TAB ****************/ |
170 | // TAB, ALT + SHIFT, TAB TAB, CTRL + SHIFT | 167 | // TAB, ALT + SHIFT, TAB TAB, CTRL + SHIFT |
171 | static xtap tab_state = { | 168 | static xtap tab_state = { |
172 | .is_press_action = true, | 169 | .is_press_action = true, |
173 | .state = 0 | 170 | .state = 0 |
174 | }; | 171 | }; |
@@ -183,7 +180,7 @@ void tab_finished (qk_tap_dance_state_t *state, void *user_data) { | |||
183 | case TRIPLE_TAP: register_code(KC_LSHIFT) ;register_code(KC_ESC); break; | 180 | case TRIPLE_TAP: register_code(KC_LSHIFT) ;register_code(KC_ESC); break; |
184 | case TRIPLE_HOLD: register_code(KC_LSHIFT); register_code(KC_LGUI); break; | 181 | case TRIPLE_HOLD: register_code(KC_LSHIFT); register_code(KC_LGUI); break; |
185 | } | 182 | } |
186 | } | 183 | } |
187 | 184 | ||
188 | void tab_reset (qk_tap_dance_state_t *state, void *user_data) { | 185 | void tab_reset (qk_tap_dance_state_t *state, void *user_data) { |
189 | switch (tab_state.state) { | 186 | switch (tab_state.state) { |
@@ -201,7 +198,7 @@ void tab_reset (qk_tap_dance_state_t *state, void *user_data) { | |||
201 | //*************** SUPER COMMA *******************// | 198 | //*************** SUPER COMMA *******************// |
202 | // Assumption: we don't care about trying to hit ,, quickly | 199 | // Assumption: we don't care about trying to hit ,, quickly |
203 | //*************** SUPER COMMA *******************// | 200 | //*************** SUPER COMMA *******************// |
204 | static xtap comma_state = { | 201 | static xtap comma_state = { |
205 | .is_press_action = true, | 202 | .is_press_action = true, |
206 | .state = 0 | 203 | .state = 0 |
207 | }; | 204 | }; |
@@ -209,19 +206,19 @@ static xtap comma_state = { | |||
209 | void comma_finished (qk_tap_dance_state_t *state, void *user_data) { | 206 | void comma_finished (qk_tap_dance_state_t *state, void *user_data) { |
210 | comma_state.state = hold_cur_dance(state); //Use the dance that favors being held | 207 | comma_state.state = hold_cur_dance(state); //Use the dance that favors being held |
211 | switch (comma_state.state) { | 208 | switch (comma_state.state) { |
212 | case SINGLE_TAP: register_code(KC_COMMA); break; | 209 | case SINGLE_TAP: register_code(KC_COMMA); break; |
213 | case SINGLE_HOLD: layer_on(1); break; //turn on symbols layer | 210 | case SINGLE_HOLD: layer_on(1); break; //turn on symbols layer |
214 | case DOUBLE_TAP: layer_invert(4); break; //toggle numbers layer | 211 | case DOUBLE_TAP: layer_invert(4); break; //toggle numbers layer |
215 | case DOUBLE_HOLD: layer_on(2); break; | 212 | case DOUBLE_HOLD: layer_on(2); break; |
216 | case TRIPLE_TAP: register_code(KC_CALCULATOR); break; | 213 | case TRIPLE_TAP: register_code(KC_CALCULATOR); break; |
217 | case TRIPLE_HOLD: layer_on(3); | 214 | case TRIPLE_HOLD: layer_on(3); |
218 | } | 215 | } |
219 | } | 216 | } |
220 | 217 | ||
221 | void comma_reset (qk_tap_dance_state_t *state, void *user_data) { | 218 | void comma_reset (qk_tap_dance_state_t *state, void *user_data) { |
222 | switch (comma_state.state) { | 219 | switch (comma_state.state) { |
223 | case SINGLE_TAP: unregister_code(KC_COMMA); break; //unregister comma | 220 | case SINGLE_TAP: unregister_code(KC_COMMA); break; //unregister comma |
224 | case SINGLE_HOLD: layer_off(1); break; | 221 | case SINGLE_HOLD: layer_off(1); break; |
225 | case DOUBLE_TAP: ;break; | 222 | case DOUBLE_TAP: ;break; |
226 | case DOUBLE_HOLD: layer_off(2); break; | 223 | case DOUBLE_HOLD: layer_off(2); break; |
227 | case TRIPLE_TAP: unregister_code(KC_CALCULATOR); break; | 224 | case TRIPLE_TAP: unregister_code(KC_CALCULATOR); break; |
@@ -235,7 +232,7 @@ void comma_reset (qk_tap_dance_state_t *state, void *user_data) { | |||
235 | 232 | ||
236 | //*************** F3 TAP DANCE *******************// | 233 | //*************** F3 TAP DANCE *******************// |
237 | //Good example for accessing multiple layers from the same key. | 234 | //Good example for accessing multiple layers from the same key. |
238 | static xtap S1_state = { | 235 | static xtap S1_state = { |
239 | .is_press_action = true, | 236 | .is_press_action = true, |
240 | .state = 0 | 237 | .state = 0 |
241 | }; | 238 | }; |
@@ -244,17 +241,17 @@ void bt_finished (qk_tap_dance_state_t *state, void *user_data) { | |||
244 | S1_state.state = cur_dance(state); | 241 | S1_state.state = cur_dance(state); |
245 | switch (S1_state.state) { | 242 | switch (S1_state.state) { |
246 | case SINGLE_TAP: register_code(KC_F3); break; | 243 | case SINGLE_TAP: register_code(KC_F3); break; |
247 | case SINGLE_HOLD: layer_on(4); break; | 244 | case SINGLE_HOLD: layer_on(_MACROS); break; |
248 | case DOUBLE_TAP: layer_invert(4); break; | 245 | case DOUBLE_TAP: layer_invert(_MACROS); break; |
249 | case DOUBLE_HOLD: layer_on(5); break; | 246 | case DOUBLE_HOLD: layer_on(5); break; |
250 | case DOUBLE_SINGLE_TAP: layer_invert(4); break; | 247 | case DOUBLE_SINGLE_TAP: layer_invert(_MACROS); break; |
251 | } | 248 | } |
252 | } | 249 | } |
253 | 250 | ||
254 | void bt_reset (qk_tap_dance_state_t *state, void *user_data) { | 251 | void bt_reset (qk_tap_dance_state_t *state, void *user_data) { |
255 | switch (S1_state.state) { | 252 | switch (S1_state.state) { |
256 | case SINGLE_TAP: unregister_code(KC_F3); break; | 253 | case SINGLE_TAP: unregister_code(KC_F3); break; |
257 | case SINGLE_HOLD: layer_off(4); break; | 254 | case SINGLE_HOLD: layer_off(_MACROS); break; |
258 | case DOUBLE_TAP: break; //already inverted. Don't do anything. | 255 | case DOUBLE_TAP: break; //already inverted. Don't do anything. |
259 | case DOUBLE_HOLD: layer_off(5); break; | 256 | case DOUBLE_HOLD: layer_off(5); break; |
260 | case DOUBLE_SINGLE_TAP: break; | 257 | case DOUBLE_SINGLE_TAP: break; |
@@ -262,14 +259,152 @@ void bt_reset (qk_tap_dance_state_t *state, void *user_data) { | |||
262 | S1_state.state = 0; | 259 | S1_state.state = 0; |
263 | } | 260 | } |
264 | 261 | ||
262 | // Tap Dance Definitions | ||
263 | qk_tap_dance_action_t tap_dance_actions[] = { | ||
264 | // simple tap dance | ||
265 | [F12ETAPS] = ACTION_TAP_DANCE_DOUBLE(KC_F12,LSFT(LCTL(KC_F10))), | ||
266 | [REFRESH] = ACTION_TAP_DANCE_DOUBLE(KC_R,LCTL(KC_R)), | ||
267 | [ENDESC] = ACTION_TAP_DANCE_DOUBLE(KC_END, KC_ESC), | ||
268 | [Q_ESCAPE] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC), | ||
269 | [ENDHOME] = ACTION_TAP_DANCE_DOUBLE(KC_END, KC_HOME), | ||
270 | [CALCCOMP] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_MY_COMPUTER), | ||
271 | [ALTF4] = ACTION_TAP_DANCE_DOUBLE(KC_F4,LALT(KC_F4)), | ||
272 | [F6F7] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_F6), LALT(KC_F7)), | ||
273 | [F1F13] = ACTION_TAP_DANCE_DOUBLE(KC_F1, KC_F13), | ||
274 | [F2F14] = ACTION_TAP_DANCE_DOUBLE(KC_F2, KC_F14), | ||
275 | [F5F15] = ACTION_TAP_DANCE_DOUBLE(KC_F5, KC_F15), | ||
276 | [TABCOMBO] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tab_finished, tab_reset), | ||
277 | [F3D] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, bt_finished, bt_reset), | ||
278 | [COMMA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, comma_finished, comma_reset), | ||
279 | [HTAB] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,h_finished, h_reset) | ||
280 | }; | ||
281 | |||
282 | // bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
283 | // if (!record->event.pressed) { | ||
284 | // switch (keycode) { | ||
285 | |||
286 | // case KC_SECRET_1 ... KC_SECRET_5: | ||
287 | // send_string(secret[keycode - KC_SECRET_1]); | ||
288 | // // clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | ||
289 | // return true; break; | ||
290 | |||
291 | // case UP_ENTER_RESET: | ||
292 | // register_code(KC_UP); | ||
293 | // unregister_code(KC_UP); | ||
294 | // register_code(KC_ENTER); | ||
295 | // unregister_code(KC_ENTER); | ||
296 | // reset_keyboard(); | ||
297 | // return false; break; | ||
298 | |||
299 | // case TIL_SLASH: | ||
300 | // SEND_STRING ("~/."); | ||
301 | // return false; break; | ||
302 | |||
303 | // case DBMS_OUT: | ||
304 | // SEND_STRING ("dbms_output.put_line('');"); | ||
305 | // SEND_STRING (SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT)); | ||
306 | // return false; break; | ||
307 | |||
308 | // case ID_MAN_IP: | ||
309 | // SEND_STRING ("http://dev-1967110238.us-east-1.elb.amazonaws.com"); | ||
310 | // return false; break; | ||
311 | |||
312 | // case MODRESET: | ||
313 | // clear_mods(); | ||
314 | // return false; break; | ||
315 | |||
316 | // case DEREF: | ||
317 | // SEND_STRING ("->"); | ||
318 | // return false; break; | ||
319 | |||
320 | // case EQRIGHT: | ||
321 | // SEND_STRING ("=>"); | ||
322 | // return false; break; | ||
323 | |||
324 | // case TICK3: | ||
325 | // SEND_STRING ("```"); | ||
326 | // return false; break; | ||
327 | |||
328 | // case TILD3: | ||
329 | // SEND_STRING ("~~~"); | ||
330 | // return false; break; | ||
331 | // } | ||
332 | // } | ||
333 | // return true; | ||
334 | // }; | ||
335 | |||
336 | |||
337 | |||
338 | |||
265 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | 339 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
266 | switch (keycode) { | 340 | if (!record->event.pressed) { |
267 | case KC_SECRET_1 ... KC_SECRET_5: | 341 | switch (keycode) { |
268 | if (!record->event.pressed) { | 342 | case KC_SECRET_1 ... KC_SECRET_5: |
269 | send_string(secret[keycode - KC_SECRET_1]); | 343 | send_string(secret[keycode - KC_SECRET_1]); |
344 | // clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | ||
345 | return true; break; | ||
346 | case UP_ENTER_RESET: | ||
347 | SEND_STRING("make ergodox_infinity:gordon:dfu-util"); | ||
348 | register_code(KC_ENTER); | ||
349 | unregister_code(KC_ENTER); | ||
350 | reset_keyboard(); | ||
351 | return false; break; | ||
352 | |||
353 | case TIL_SLASH: | ||
354 | SEND_STRING ("~/."); | ||
355 | return false; break; | ||
356 | |||
357 | case DBMS_OUT: | ||
358 | SEND_STRING ("dbms_output.put_line('');"); | ||
359 | SEND_STRING (SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT)); | ||
360 | return false; break; | ||
361 | case DIE_1000X_RIGHT: | ||
362 | SEND_STRING (SS_TAP(X_G) SS_TAP(X_G) SS_TAP(X_RIGHT) SS_TAP(X_B) SS_TAP(X_J)); | ||
363 | return false; break; | ||
364 | case DIE_1000X_LEFT: | ||
365 | SEND_STRING (SS_TAP(X_GRAVE) SS_TAP(X_G) SS_TAP(X_LEFT) SS_TAP(X_B) SS_TAP(X_J)); | ||
366 | return false; break; | ||
367 | case ID_MAN_IP: | ||
368 | SEND_STRING ("http://dev-1967110238.us-east-1.elb.amazonaws.com"); | ||
369 | return false; break; | ||
370 | |||
371 | case MODRESET: | ||
372 | clear_mods(); | ||
373 | return false; break; | ||
374 | |||
375 | case DEREF: | ||
376 | SEND_STRING ("->"); | ||
377 | return false; break; | ||
378 | |||
379 | case EQRIGHT: | ||
380 | SEND_STRING ("=>"); | ||
381 | return false; break; | ||
382 | |||
383 | case TICK3: | ||
384 | SEND_STRING ("```"); | ||
385 | |||
386 | return false; break; | ||
387 | |||
388 | case SPRK_TCK: | ||
389 | SEND_STRING ("```"); | ||
390 | SEND_STRING (SS_DOWN(X_LSHIFT) SS_TAP(X_ENTER) SS_UP(X_LSHIFT)); | ||
391 | SEND_STRING (SS_DOWN(X_LSHIFT) SS_TAP(X_ENTER) SS_UP(X_LSHIFT)); | ||
392 | SEND_STRING ("```"); | ||
393 | SEND_STRING (SS_TAP(X_UP)); | ||
394 | return false; break; | ||
395 | |||
396 | case TILD3: | ||
397 | SEND_STRING ("~~~"); | ||
398 | return false; break; | ||
399 | } | ||
400 | } | ||
401 | else { //On key being pressed | ||
402 | switch (keycode) { | ||
403 | case KC_SECRET_1 ... KC_SECRET_5: | ||
404 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | ||
405 | return false; break; | ||
270 | } | 406 | } |
271 | return false; | ||
272 | break; | ||
273 | } | 407 | } |
274 | return true; | 408 | return true; |
275 | } \ No newline at end of file | 409 | }; |
410 | |||